home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 44 / Amiga Format CD44 (1999-08-26)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-10].iso / -in_the_mag- / basics / amos / multiwindows.lha / MultiWindows / Multiwin.amos / Multiwin.amosSourceCode
AMOS Source Code  |  1999-01-04  |  64KB  |  2,278 lines

  1. Set Buffer 30
  2. '
  3. ' ** Welcome to MultiWindows, an experiment by Martin Cameron. 
  4. '    
  5. '    This is based on some interface code from Turbo Plus. 
  6. '
  7. '    Ever wanted to make a cool interface for an AMOS program? 
  8. '    These procs give you everything you need - windows, buttons,
  9. '    sliders, checkboxes, file selectors etc. All you have to worry
  10. '    about are a few screen coordinates. 
  11. '
  12. '    That was the idea, anyway. What I've ended up with is a 100k
  13. '     monster that causes grief to any minor programming exercise. 
  14. '     It's still a bit cool, having custom windows, though.  
  15. '
  16. '  
  17. '  
  18. '    Some essential info follows.... 
  19. '
  20. '
  21. '    Always bring a window to the front before changing it's contents! 
  22. '     This is BLOODY IMPORTANT, or you'll get pissed off.. 
  23. '
  24. '
  25. '    Do NOT create window 0! The Array space is used to store some 
  26. '     global things, and the interface may not work! 
  27. '
  28. '    The screen after WINSCREEN is used as a double buffer, and should 
  29. '     be opened before it so it is out of sight. It must have the same 
  30. '     dimensions/ no. colours as winscreen.
  31. '
  32. '    Windows can be slow on anything above a 4 colour screen. When 
  33. '     using 4 colours, set VDGREY to the same colour as VGREY. 
  34. '
  35. '     When creating buttons or setting zones, don't use gadnum 1 to 4, 
  36. '      because these are the dragbar/closegadget etc : 
  37. '
  38. '         Winzone 1 : Reserved for close gadget (raises WINCLOSED) 
  39. '         Winzone 2 : Reserved for Depth gadget (sends window to back) 
  40. '         Winzone 3 : reserved for size (raises WINSIZED)  
  41. '         Winzone 4 : Reserved for drag bar  
  42. '
  43. '    Winzone 5 and above : Free for your buttons.
  44. '
  45. '    Using sizegadgets are a pain... Once sized, you MUST :
  46. '      1) Redraw the window's framework. 
  47. '      2) Call the create procedures for all the gadgets on that window  
  48. '              This means storing temporary values for the old gadgets 
  49. '              and writing them back once the new gadget is drawn. 
  50. '              See the doc for the info you will need! 
  51. '         ** Not any more! Use gad_move to redraw and reposition 
  52. '            gadgets after a resize! - Mart June 98  
  53. '
  54. '
  55. '
  56. '   Final note .. This is FREE!   Do what the hell you like with it! 
  57. '    This means, of course - Debug it, It's bloody well full of 'em. 
  58. '
  59. '
  60. '  Send warez/bugs to :          Mart,   
  61. '                                46 Ribby Road,  
  62. '                                Kirkham, Lancs, PR4 2BA, UK.  
  63. '
  64. '
  65. '
  66. '
  67. '
  68. '
  69. '  Wincount - Number of windows to reserve buffer space for. 
  70. '             The last window is always used by the file selector and
  71. '             requestor, so don't use it - it will be overwritten! 
  72. '
  73. '  When using the file selector, set gadcount to at least 15, or you 
  74. '   will get an error! If using the requestor, gadcount at least 6.
  75. '  
  76. ' In any case, it should never be below 4. 
  77. '
  78. WINCOUNT=10 : GADCOUNT=20 : Set Dir 60
  79. '
  80. '
  81. '
  82. ' For more complex programs, such as a file selector, you will need to 
  83. '  know what these arrays are for. See the doc file. 
  84. '
  85. '
  86. Dim WININFO(WINCOUNT,8),WINORDER(WINCOUNT),WINZONE(WINCOUNT,GADCOUNT,4)
  87. Global WININFO(),WINORDER(),WINZONE(),WINCOUNT,GADCOUNT
  88. Global WINSIZED,WINSELECTED,WINCLOSED
  89. Global VBLACK,VWHITE,VGREY,VBLUE,VDGREY
  90. '
  91. Dim GADTEXT$(WINCOUNT,GADCOUNT),GADSTUFF(WINCOUNT,GADCOUNT,6)
  92. Dim FILELIST$(300),GADRADIO(WINCOUNT,GADCOUNT)
  93. Global GADTEXT$(),GADSTUFF(),FILELIST$(),FILEDIR$,GADRADIO()
  94. '
  95. '
  96. '
  97. '
  98. '
  99. Screen Open 2,640,256,8,Hires : Curs Off : Flash Off : Cls 0
  100. Screen Open 1,640,256,8,Hires : Curs Off : Flash Off : Cls 0
  101. Palette $0,$FFF,$AAA,$68B,$777 : Proc WIN_SETCOLOURS[0,1,2,3,4]
  102. '
  103. '
  104. '
  105. '
  106. '
  107. '
  108. '
  109. '
  110. '
  111. '  ***  test program. Remove this code below when writing your stuff.      
  112. '
  113. '
  114. '
  115. ' Set windows system up using screens 1 and 2
  116. Proc WIN_SETUP[1]
  117. '
  118. N=1
  119. Proc WIN_CREATE[N,N+10,N+20,300,150,300,150,630,240]
  120. Proc WIN_FRAMEWORK[N,3,0,7,4,"TestWin"]
  121. '
  122. GAD_BUTTON_CREATE[N,5,10,20,11,"Select File"]
  123. '
  124. GAD_CYCLE_CREATE[N,6,10,40,10,"Testcycle"]
  125. GAD_CYCLE_ADDITEM[N,6,"Cycle2"]
  126. GAD_CYCLE_ADDITEM[N,6,"Cycle3"]
  127. '
  128. GAD_TEXT_CREATE[N,7,10,55,20,"TestText",0]
  129. GAD_DISPLAY_CREATE[N,8,10,70,20,"Display"]
  130.  
  131. GAD_CHECKBOX_CREATE[N,9,140,20]
  132.  
  133. GAD_SLIDER_CREATE[N,10,275,20,20,80,5,2]
  134. 'GAD_VSLIDEBUT_CREATE[N,11,10] 
  135.  
  136. GAD_HSLIDER_CREATE[N,12,10,125,200,12,5,2]
  137. 'GAD_HSLIDEBUT_CREATE[N,13,12] 
  138. GAD_SBUT_CREATE[N,13,50,100,20,20,4]
  139.  
  140. GAD_SCROLLBUT_CREATE[N,14,250,125]
  141.  
  142. GAD_RADIOBUT_CREATE[N,15,240,20,1]
  143. GAD_RADIOBUT_CREATE[N,16,240,30,1]
  144. GAD_RADIOBUT_CREATE[N,17,240,40,1]
  145. GAD_RADIOBUT_CREATE[N,18,240,60,2]
  146. GAD_RADIOBUT_CREATE[N,19,240,70,2]
  147.  
  148. Proc WIN_SETGFX[N]
  149.  
  150. '
  151. '  
  152. '   Main loop of test program. 
  153. '
  154. '
  155.  
  156. Do 
  157.    
  158.    Proc WINSCAN : GADGET=Param
  159.    
  160.    
  161.    If GADGET=5
  162.       WIN_FILE_SELECTOR[10,10,60,"filer"]
  163.       
  164.       ' BRING WINDOW TO FRONT BEFORE CHANGING GADGET CONTENTS!!
  165.       WINTOFRONT[1]
  166.       
  167.       GAD_TEXT_SET[1,7,Param$,0,0]
  168.    End If 
  169.    
  170.    If GADGET=6
  171.       'Print WINSELECTED 
  172.       GAD_CYCLE_PUSH[WINSELECTED,6]
  173.    End If 
  174.    
  175.    If GADGET=7
  176.       GAD_TEXT_INPUT[WINSELECTED,7]
  177.       GAD_TEXT_GET[WINSELECTED,7]
  178.       GAD_DISPLAY_SET[WINSELECTED,8,Param$]
  179.    End If 
  180.    
  181.    If GADGET=9
  182.       GAD_CHECKBOX_TICK[WINSELECTED,9]
  183.    End If 
  184.    
  185.    If GADGET=10
  186.       Repeat 
  187.          GAD_SLIDER_MOUSE_UPDATE[WINSELECTED,10]
  188.       Until Mouse Key=0
  189.       '      GAD_SLIDEOFF[WINSELECTED,10]
  190.    End If 
  191.    
  192.    If GADGET=11
  193.       Repeat 
  194.          '         GAD_VSLIDEBUT_UPDATE[WINSELECTED,11] 
  195.       Until Mouse Key=0
  196.       '      GAD_SLIDEOFF[WINSELECTED,11]
  197.    End If 
  198.    
  199.    If GADGET=12
  200.       'slider loop 
  201.       Repeat 
  202.          GAD_HSLIDER_MOUSE_UPDATE[WINSELECTED,12]
  203.       Until Mouse Key=0
  204.       ' turn slider off - important
  205.       '      GAD_SLIDEOFF[WINSELECTED,12]
  206.    End If 
  207.    
  208.    If GADGET=13
  209.       '      Repeat  
  210.       Bell 
  211.       '         GAD_HSLIDEBUT_UPDATE[WINSELECTED,13] 
  212.       '      Until Mouse Key=0 
  213.       '      GAD_SLIDEOFF[WINSELECTED,13]
  214.    End If 
  215.    
  216.    If GADGET=14
  217.       Repeat 
  218.          GAD_SCROLLBUT_UPDATE[WINSELECTED,14]
  219.       Until Mouse Key=0
  220.       GAD_SCROLLOFF[WINSELECTED,14]
  221.    End If 
  222.    
  223.    If GADGET>14
  224.       GAD_RADIOBUT_PUSH[WINSELECTED,GADGET]
  225.    End If 
  226.    
  227.    If WINSIZED
  228.       WIN_SIZE[WINSIZED]
  229.       If Param=1
  230.          '
  231.          '   Check if window changed shape... 
  232.          '
  233.          WIN_FRAMEWORK[WINSIZED,3,0,7,4,"Sizedwin"]
  234.          '
  235.          '   Redraw gadgets here! 
  236.          '    
  237.          For N=5 To 19
  238.             GAD_MOVE[WINSIZED,N,WINZONE(WINSIZED,N,1),WINZONE(WINSIZED,N,2)]
  239.          Next N
  240.          '
  241.          WIN_SETGFX[WINSIZED]
  242.       End If 
  243.    End If 
  244.    
  245.    If WINCLOSED=1
  246.       
  247.       GAD_REQUEST[100,100,"Request","Really close?","You can't be serious!","","       Yep        ","   Nope  "]
  248.       If Param=1 : WIN_CLOSE[1]
  249.          GAD_REQUEST[100,100,"Bugger..","","Now you've buggered it","","","Quit"]
  250.       End : End If 
  251.    End If 
  252.    
  253. Loop 
  254. '
  255. '
  256. '
  257. '
  258. '
  259. '
  260. '
  261. '   The important bit... The Multiwindows Procedures 
  262. '
  263. '
  264. '
  265. Procedure WIN_FRAMEWORK[NUM,GSTYLE,PSTYLE,PCOL1,PCOL2,TITLE$]
  266.    X=WININFO(NUM,1)
  267.    Y=WININFO(NUM,2)
  268.    W=WININFO(NUM,3)-X
  269.    H=WININFO(NUM,4)-Y
  270.    '
  271.    If PSTYLE=>0
  272.       Ink PCOL1,PCOL2
  273.       Set Pattern PSTYLE
  274.       Bar X,Y To W+X,H+Y
  275.       Set Pattern 0
  276.    End If 
  277.    
  278.    If GSTYLE=1
  279.       WIN_SET_ZONE[NUM,4,4,2,W-26,11]
  280.       GAD_RAISEBOX_CREATE[X+4,Y+2,W-26,11,2]
  281.       
  282.       WIN_SET_ZONE[NUM,2,W-19,3,15,9]
  283.       GAD_RAISEBOX_CREATE[X+W-19,Y+3,15,9,2]
  284.       Ink VWHITE : Draw X+W-15,Y+6 To X+W-8,Y+6
  285.       Ink VDGREY : Draw X+W-15,Y+8 To X+W-8,Y+8
  286.       Ink VBLACK,VGREY : Draw X+W-15,Y+9 To X+W-8,Y+9
  287.       
  288.       TEXSPC=(W-33)/8
  289.       If Len(TITLE$)>TEXSPC
  290.          TITLE$=Left$(TITLE$,TEXSPC)
  291.       End If 
  292.       
  293.       Text X+10,Y+10,TITLE$
  294.       
  295.    Else If GSTYLE=2
  296.       
  297.       WIN_SET_ZONE[NUM,4,4,2,W-26,11]
  298.       GAD_RAISEBOX_CREATE[X+4,Y+2,W-26,11,2]
  299.       
  300.       WIN_SET_ZONE[NUM,1,7,4,14,7]
  301.       GAD_RAISEBOX_CREATE[X+7,Y+4,14,7,2]
  302.       
  303.       WIN_SET_ZONE[NUM,2,W-19,3,15,9]
  304.       GAD_RAISEBOX_CREATE[X+W-19,Y+3,15,9,2]
  305.       Ink VWHITE : Draw X+W-15,Y+6 To X+W-8,Y+6
  306.       Ink VDGREY : Draw X+W-15,Y+8 To X+W-8,Y+8
  307.       Ink VBLACK,VGREY : Draw X+W-15,Y+9 To X+W-8,Y+9
  308.       
  309.       TEXSPC=(W-48)/8
  310.       If Len(TITLE$)>TEXSPC
  311.          TITLE$=Left$(TITLE$,TEXSPC)
  312.       End If 
  313.       
  314.       Text X+26,Y+10,TITLE$
  315.       
  316.    Else If GSTYLE=3
  317.       
  318.       WIN_SET_ZONE[NUM,4,4,2,W-26,11]
  319.       GAD_RAISEBOX_CREATE[X+4,Y+2,W-26,11,2]
  320.       
  321.       WIN_SET_ZONE[NUM,1,7,4,14,7]
  322.       GAD_RAISEBOX_CREATE[X+7,Y+4,14,7,2]
  323.       
  324.       WIN_SET_ZONE[NUM,2,W-19,3,15,9]
  325.       GAD_RAISEBOX_CREATE[X+W-19,Y+3,15,9,2]
  326.       Ink VWHITE : Draw X+W-15,Y+6 To X+W-8,Y+6
  327.       Ink VDGREY : Draw X+W-15,Y+8 To X+W-8,Y+8
  328.       Ink VBLACK,VGREY : Draw X+W-15,Y+9 To X+W-8,Y+9
  329.       
  330.       TEXSPC=(W-48)/8
  331.       If Len(TITLE$)>TEXSPC
  332.          TITLE$=Left$(TITLE$,TEXSPC)
  333.       End If 
  334.       
  335.       Text X+26,Y+10,TITLE$
  336.       
  337.       WIN_SET_ZONE[NUM,3,W-19,H-10,14,7]
  338.       Ink VGREY : Polygon X+W-19,H+Y-3 To X+W-5,H+Y-3 To X+W-5,H+Y-10
  339.       Ink VBLACK : Polyline X+W-19,H+Y-3 To X+W-5,H+Y-3 To X+W-5,H+Y-10
  340.       Ink VWHITE : Draw X+W-19,H+Y-3 To X+W-5,H+Y-10
  341.       
  342.    End If 
  343.    '
  344.    GAD_RAISEBOX_CREATE[X,Y,W,H,3]
  345.    '  
  346. End Proc
  347. Procedure WIN_SETGFX[NUM]
  348.    WINX=WININFO(NUM,1)
  349.    WINY=WININFO(NUM,2)
  350.    WINWIDTH=WININFO(NUM,3)-WINX
  351.    WINHEIGHT=WININFO(NUM,4)-WINY
  352.    '
  353.    Get Block 9000+NUM,WINX,WINY,WINWIDTH+1,WINHEIGHT+1,1
  354. End Proc
  355. Procedure WIN_SET_ZONE[WINNUM,GADNUM,X,Y,WIDTH,HEIGHT]
  356.    WINZONE(WINNUM,GADNUM,1)=X
  357.    WINZONE(WINNUM,GADNUM,2)=Y
  358.    WINZONE(WINNUM,GADNUM,3)=X+WIDTH
  359.    WINZONE(WINNUM,GADNUM,4)=Y+HEIGHT
  360. End Proc
  361. Procedure WINSCAN
  362.    
  363.    If WINSIZED>0 : WINSIZED=0 : End If 
  364.    If WINCLOSED>0 : WINCLOSED=0 : End If 
  365.    
  366.    If Mouse Key=1
  367.       XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse)
  368.       For N=1 To WINCOUNT
  369.          NUM=WINORDER(N)
  370.          If WININFO(NUM,0)=1
  371.             If XM=>WININFO(NUM,1) and YM=>WININFO(NUM,2)
  372.                If XM<=WININFO(NUM,3) and YM<=WININFO(NUM,4)
  373.                   If N>1
  374.                      Proc WINTOFRONT[NUM] : Exit 
  375.                   Else 
  376.                      Exit 
  377.                   End If 
  378.                End If 
  379.             End If 
  380.          End If 
  381.       Next N
  382.       '      XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse) 
  383.       WINX=WININFO(NUM,1) : WINY=WININFO(NUM,2)
  384.       For N=1 To GADCOUNT
  385.          If XM=>WINZONE(NUM,N,1)+WINX and YM=>WINZONE(NUM,N,2)+WINY
  386.             If XM<=WINZONE(NUM,N,3)+WINX and YM<=WINZONE(NUM,N,4)+WINY
  387.                GADRETURN=N : Exit 
  388.             End If 
  389.          End If 
  390.       Next N
  391.       '
  392.       '
  393.       If GADRETURN<5
  394.          If GADRETURN=4
  395.             Proc WINDRAG[NUM]
  396.             
  397.          Else If GADRETURN=2
  398.             XS1=WINZONE(NUM,2,1)+WININFO(NUM,1) : YS1=WINZONE(NUM,2,2)+WININFO(NUM,2)
  399.             XS2=WINZONE(NUM,2,3)+WININFO(NUM,1) : YS2=WINZONE(NUM,2,4)+WININFO(NUM,2)
  400.             While Mouse Key=1
  401.                XSM=X Screen(X Mouse) : YSM=Y Screen(Y Mouse)
  402.                If XSM=>XS1 and XSM<=XS2 and YSM=>YS1 and YSM<=YS2
  403.                   If SELEKT=0
  404.                      GAD_LOWERBOX_CREATE[XS1,YS1,XS2-XS1,YS2-YS1,1]
  405.                      SELEKT=1
  406.                   End If 
  407.                Else 
  408.                   If SELEKT=1
  409.                      GAD_RAISEBOX_CREATE[XS1,YS1,XS2-XS1,YS2-YS1,1]
  410.                      SELEKT=0
  411.                   End If 
  412.                End If 
  413.             Wend 
  414.             If SELEKT=1
  415.                GAD_RAISEBOX_CREATE[XS1,YS1,XS2-XS1,YS2-YS1,1]
  416.                Proc WINTOBACK[NUM]
  417.             End If 
  418.             
  419.          Else If GADRETURN=1
  420.             XS1=WINZONE(NUM,1,1)+WININFO(NUM,1) : YS1=WINZONE(NUM,1,2)+WININFO(NUM,2)
  421.             XS2=WINZONE(NUM,1,3)+WININFO(NUM,1) : YS2=WINZONE(NUM,1,4)+WININFO(NUM,2)
  422.             While Mouse Key=1
  423.                XSM=X Screen(X Mouse) : YSM=Y Screen(Y Mouse)
  424.                If XSM=>XS1 and XSM<=XS2 and YSM=>YS1 and YSM<=YS2
  425.                   If SELEKT=0
  426.                      GAD_LOWERBOX_CREATE[XS1,YS1,XS2-XS1,YS2-YS1,2]
  427.                      SELEKT=1
  428.                   End If 
  429.                Else 
  430.                   If SELEKT=1
  431.                      GAD_RAISEBOX_CREATE[XS1,YS1,XS2-XS1,YS2-YS1,2]
  432.                      SELEKT=0
  433.                   End If 
  434.                End If 
  435.             Wend 
  436.             If SELEKT=1
  437.                GAD_RAISEBOX_CREATE[XS1,YS1,XS2-XS1,YS2-YS1,2]
  438.                WINCLOSED=NUM
  439.             End If 
  440.             
  441.          Else If GADRETURN=3
  442.             '            Proc WIN_SIZE[NUM]
  443.             WINSIZED=NUM
  444.          End If 
  445.          
  446.          GADRETURN=0
  447.          
  448.       Else If WINZONE(NUM,GADRETURN,0)=1 or WINZONE(NUM,GADRETURN,0)=7 or WINZONE(NUM,GADRETURN,0)=20
  449.          GTEM=GADRETURN
  450.          Do 
  451.             XM=X Screen(X Mouse)-WINX : YM=Y Screen(Y Mouse)-WINY
  452.             If XM<WINZONE(NUM,GTEM,1) or XM>WINZONE(NUM,GTEM,3) or YM<WINZONE(NUM,GTEM,2) or YM>WINZONE(NUM,GTEM,4)
  453.                If T=1
  454.                   If WINZONE(NUM,GTEM,0)=1 : GAD_BUTTON_OUT[NUM,GTEM] : GADRETURN=0 : End If 
  455.                   If WINZONE(NUM,GTEM,0)=7 : GAD_CYCLE_OUT[NUM,GTEM] : GADRETURN=0 : End If 
  456.                   If WINZONE(NUM,GTEM,0)=20 : GAD_SBUT_OUT[NUM,GTEM] : GADRETURN=0 : End If 
  457.                T=0 : End If 
  458.             Else 
  459.                If T=0
  460.                   If WINZONE(NUM,GTEM,0)=1 : GAD_BUTTON_IN[NUM,GTEM] : GADRETURN=GTEM : End If 
  461.                   If WINZONE(NUM,GTEM,0)=7 : GAD_CYCLE_IN[NUM,GTEM] : GADRETURN=GTEM : End If 
  462.                   If WINZONE(NUM,GTEM,0)=20 : GAD_SBUT_IN[NUM,GTEM] : GADRETURN=GTEM : End If 
  463.                T=1 : End If 
  464.             End If 
  465.             Exit If Mouse Key=0
  466.          Loop 
  467.          If GADRETURN>0
  468.             If WINZONE(NUM,GADRETURN,0)=1 : GAD_BUTTON_OUT[NUM,GADRETURN] : End If 
  469.             If WINZONE(NUM,GADRETURN,0)=7 : GAD_CYCLE_OUT[NUM,GADRETURN] : End If 
  470.             If WINZONE(NUM,GADRETURN,0)=20 : GAD_SBUT_OUT[NUM,GADRETURN] : End If 
  471.          End If 
  472.       End If 
  473.       If GADRETURN=0 and WINSIZED=0 : Repeat : Until Mouse Key=0 : End If 
  474.    End If 
  475. End Proc[GADRETURN]
  476. Procedure WIN_SETUP[WINSCREEN]
  477.    
  478.    WININFO(0,0)=WINSCREEN
  479.    Screen To Front WINSCREEN
  480.    Screen WINSCREEN
  481.    
  482.    S=WINCOUNT : WINSIZED=0
  483.    For N=1 To WINCOUNT
  484.       WINORDER(N)=S : Dec S
  485.    Next N
  486. End Proc
  487. Procedure WIN_CREATE[NUM,X,Y,WIDTH,HEIGHT,XSIZEMIN,YSIZEMIN,XSIZEMAX,YSIZEMAX]
  488.    
  489.    WINTOFRONT[NUM]
  490.  
  491.    SWIDTH=Screen Width(WININFO(0,0))
  492.    
  493.    WININFO(NUM,0)=1
  494.    WININFO(NUM,1)=X
  495.    WININFO(NUM,2)=Y
  496.    
  497.    If WIDTH=>SWIDTH : WIDTH=SWIDTH-1 : End If 
  498.    If X+WIDTH=>SWIDTH : X=SWIDTH-WIDTH-1 : End If 
  499.    
  500.    WININFO(NUM,3)=X+WIDTH
  501.    WININFO(NUM,4)=Y+HEIGHT
  502.    WININFO(NUM,5)=XSIZEMIN
  503.    WININFO(NUM,6)=YSIZEMIN
  504.    WININFO(NUM,7)=XSIZEMAX
  505.    WININFO(NUM,8)=YSIZEMAX
  506.    
  507.    WINSELECTED=NUM
  508.  
  509. End Proc
  510. Procedure WIN_REDRAW[NUM]
  511.    OPEN=WININFO(NUM,0)
  512.    If OPEN=0 : Pop Proc : End If 
  513.    X=WININFO(NUM,1)
  514.    Y=WININFO(NUM,2)
  515.    WIDTH=WININFO(NUM,3)-X
  516.    HEIGHT=WININFO(NUM,4)-Y
  517.    Ink WININFO(0,1) : Bar X,Y To X+WIDTH,Y+HEIGHT
  518.    'Trap Put Block 9000+NUM,X,Y 
  519.    Put Block 9000+NUM,X,Y
  520.    WINSELECTED=NUM
  521.    
  522. End Proc
  523. Procedure WINTOFRONT[NUM]
  524.    
  525.    WINSCREEN=WININFO(0,0)
  526.    
  527.    ' below needed since content of foremost win may have changed. 
  528. If WININFO(WINORDER(1),0)=1
  529. ' check if window is open or not.
  530.    WIN_SETGFX[WINORDER(1)]
  531. End If 
  532.    
  533.    For N=1 To WINCOUNT
  534.       If WINORDER(N)=NUM Then TMP=N : Exit 
  535.    Next N
  536.    '
  537.    If TMP=1 : Pop Proc : End If 
  538.    '
  539.    For N=TMP To 2 Step -1
  540.       WINORDER(N)=WINORDER(N-1)
  541.    Next N
  542.    '
  543.    WINORDER(1)=NUM
  544.    '
  545.    WIN_REDRAW[WINORDER(1)]
  546. End Proc
  547. Procedure WIN_SELUPDATE[FAST,X,Y,X2,Y2]
  548.    '
  549.    ' What does the sel mean? This could be much quicker if amos supported 
  550.    '  pasting of block sections, but it doesn't .... what an arse.
  551.    '    
  552.    WINSCREEN=WININFO(0,0)
  553.    Screen WINSCREEN+1 : Rem double buffer
  554.    
  555.    If FAST=0 : WIN_SELBACKDROP[X,Y,X2,Y2] : End If 
  556.    
  557.    For N=WINCOUNT To 1 Step -1
  558.       
  559.       WO=WINORDER(N)
  560.       If WININFO(WO,0)=1
  561.          
  562.          WINX=WININFO(WO,1)
  563.          WINY=WININFO(WO,2)
  564.          WINX2=WININFO(WO,3)
  565.          WINY2=WININFO(WO,4)
  566.          
  567.          If WINX<=X2 and WINX2=>X
  568.             If WINY<=Y2 and WINY2=>Y
  569.                WIN_REDRAW[WO]
  570.             End If 
  571.          End If 
  572.       End If 
  573.    Next N
  574.    
  575.    Screen Copy WINSCREEN+1,X,Y,X2+1,Y2+1 To WINSCREEN,X,Y
  576.    Screen WINSCREEN
  577.    
  578.    Repeat : Until Mouse Key=0
  579.    
  580. End Proc
  581. Procedure WINTOBACK[NUM]
  582.    
  583.    ' see wintofront...
  584.    WIN_SETGFX[WINORDER(1)]
  585.    
  586.    For N=2 To WINCOUNT
  587.       WINORDER(N-1)=WINORDER(N)
  588.    Next N
  589.    WINORDER(WINCOUNT)=NUM
  590.    '
  591.    X=WININFO(NUM,1)
  592.    Y=WININFO(NUM,2)
  593.    X2=WININFO(NUM,3)
  594.    Y2=WININFO(NUM,4)
  595.    
  596.    Proc WIN_SELUPDATE[1,X,Y,X2,Y2]
  597.    
  598. End Proc
  599. Procedure WIN_SETCOLOURS[VBLACK,VWHITE,VGREY,VBLUE,VDGREY]
  600. ' You ain't seen me. Right?  
  601. End Proc
  602. Procedure WINDRAG[NUM]
  603.    X=WININFO(NUM,1)
  604.    Y=WININFO(NUM,2)
  605.    X2=WININFO(NUM,3)-X
  606.    Y2=WININFO(NUM,4)-Y
  607.    WINSCREEN=WININFO(0,0)
  608.    '
  609.    DX=X Screen(X Mouse)-X
  610.    DY=Y Screen(Y Mouse)-Y
  611.    Gr Writing 3
  612.    '
  613.    Repeat 
  614.       XM=X Screen(X Mouse)-DX
  615.       If XM<0 : XM=0 : End If 
  616.       If XM+X2>Screen Width(WINSCREEN)-1 : XM=Screen Width(WINSCREEN)-X2-1 : End If 
  617.       YM=Y Screen(Y Mouse)-DY
  618.       If YM<0 : YM=0 : End If 
  619.       If YM+Y2>Screen Height(WINSCREEN)-1 : YM=Screen Height(WINSCREEN)-Y2-1 : End If 
  620.       If OXM<>XM or OYM<>YM
  621.          Box XM,YM To XM+X2,YM+Y2
  622.          Box XM,YM To XM+X2,YM+Y2
  623.       Else 
  624.          Box XM,YM To XM+X2,YM+Y2
  625.          Do 
  626.             XX=X Screen(X Mouse)-DX
  627.             If XX<0 : XX=0 : End If 
  628.             If XX+X2>Screen Width(WINSCREEN)-1 : XX=Screen Width(WINSCREEN)-X2-1 : End If 
  629.             YY=Y Screen(Y Mouse)-DY
  630.             If YY<0 : YY=0 : End If 
  631.             If YY+Y2>Screen Height(WINSCREEN)-1 : YY=Screen Height(WINSCREEN)-Y2-1 : End If 
  632.             Exit If OXM<>XX or OYM<>YY or Mouse Key<>1
  633.          Loop 
  634.          Box XM,YM To XM+X2,YM+Y2
  635.       End If 
  636.       OXM=XM : OYM=YM
  637.    Until Mouse Key<>1
  638.    Gr Writing 1
  639.    '
  640.    If Not(XM=X and YM=Y)
  641.       
  642.       WIN_SETGFX[NUM]
  643.       
  644.       WININFO(NUM,0)=0 : Rem temp.disable 
  645.       WIN_SELUPDATE[0,X,Y,X2+X,Y2+Y]
  646.       WININFO(NUM,0)=1
  647.       
  648.       WININFO(NUM,1)=XM
  649.       WININFO(NUM,2)=YM
  650.       WININFO(NUM,3)=XM+X2
  651.       WININFO(NUM,4)=YM+Y2
  652.       
  653.       '      Proc WIN_UPDATE[0]
  654.       Proc WIN_REDRAW[NUM]
  655.       
  656.    End If 
  657.    
  658. End Proc
  659. Procedure WIN_CLOSE[NUM]
  660.    
  661.    X=WININFO(NUM,1)
  662.    Y=WININFO(NUM,2)
  663.    X2=WININFO(NUM,3)
  664.    Y2=WININFO(NUM,4)
  665.    
  666.    For N=0 To 8
  667.       WININFO(NUM,N)=0
  668.    Next N
  669.    For N=0 To GADCOUNT
  670.       For Q=0 To 4
  671.          WINZONE(NUM,N,Q)=0
  672.       Next Q
  673.    Next N
  674.    
  675.    Del Block 9000+NUM
  676.    
  677.    Proc WIN_SELUPDATE[0,X,Y,X2,Y2]
  678.    
  679. End Proc
  680. Procedure WIN_SIZE[NUM]
  681.    WINSCREEN=WININFO(0,0)
  682.    X=WININFO(NUM,1)
  683.    Y=WININFO(NUM,2)
  684.    X2=WININFO(NUM,3) : OX=X2 : XO2=X2
  685.    Y2=WININFO(NUM,4) : OY=Y2 : YO2=Y2
  686.    XSMIN=WININFO(NUM,5)
  687.    YSMIN=WININFO(NUM,6)
  688.    XSMAX=WININFO(NUM,7)
  689.    YSMAX=WININFO(NUM,8)
  690.    '
  691.    DX=X2-X Screen(X Mouse)
  692.    DY=Y2-Y Screen(Y Mouse)
  693.    Gr Writing 3
  694.    While Mouse Key=1
  695.       X2=X Screen(X Mouse)+DX
  696.       Y2=Y Screen(Y Mouse)+DY
  697.       If X2-X<XSMIN : X2=XSMIN+X : End If 
  698.       If Y2-Y<YSMIN : Y2=YSMIN+Y : End If 
  699.       If X2-X>XSMAX : X2=XSMAX+X : End If 
  700.       If Y2-Y>YSMAX : Y2=YSMAX+Y : End If 
  701.       If X2>Screen Width(WINSCREEN)-1 : X2=Screen Width(WINSCREEN)-1 : End If 
  702.       If Y2>Screen Height(WINSCREEN)-1 : Y2=Screen Height(WINSCREEN)-1 : End If 
  703.       
  704.       If OX<>X2 or OY<>Y2
  705.          Box X,Y To OX,OY : BXON=0
  706.          OX=X2 : OY=Y2
  707.       End If 
  708.       If BXON=0 : Box X,Y To X2,Y2 : BXON=1 : End If 
  709.    Wend 
  710.    If WININFO(NUM,3)=X2 and WININFO(NUM,4)=Y2
  711.       OUTPUT=0 : FASTUPD=1
  712.    Else 
  713.       OUTPUT=1
  714.       
  715.       If WININFO(NUM,3)<=X2 and WININFO(NUM,4)<=Y2
  716.          FASTUPD=1
  717.       Else FASTUPD=0
  718.       End If 
  719.       
  720.    End If 
  721.    
  722.    WININFO(NUM,3)=X2
  723.    WININFO(NUM,4)=Y2
  724.    
  725.    If BXON=1 : Box X,Y To X2,Y2 : End If 
  726.    Gr Writing 1
  727.    
  728.    If FASTUPD=0
  729.       WIN_SETGFX[NUM]
  730.       
  731.       WININFO(NUM,0)=0 : Rem Disable Temporarily
  732.       Proc WIN_SELUPDATE[0,X,Y,XO2,YO2]
  733.       WININFO(NUM,0)=1
  734.       
  735.       Proc WIN_REDRAW[NUM]
  736.       'Proc WIN_UPDATE[0]
  737.       
  738.    End If 
  739.    
  740. End Proc[OUTPUT]
  741. Procedure WIN_SELBACKDROP[X,Y,X2,Y2]
  742.    '
  743.    ' Redraw backdrop at specified coords. You could put a screen copy in here 
  744.    '  for a graphical backdrop. 
  745.    '
  746.    Ink WININFO(0,1)
  747.    Bar X,Y To X2,Y2
  748.    
  749. End Proc
  750. '
  751. '
  752. Procedure GAD_RAISEBOX_CREATE[X,Y,WIDTH,HEIGHT,STYLE]
  753.    '
  754.    XW=X+WIDTH : YH=Y+HEIGHT : XX=X+1 : YY=Y+1
  755.    XWL=X+WIDTH-1 : YHL=Y+HEIGHT-1
  756.    
  757.    If STYLE=2 or STYLE=4
  758.       Ink VGREY : Bar XX,YY To XWL,YHL
  759.    End If 
  760.    Set Pattern 0
  761.    '
  762.    If STYLE<3
  763.       Ink VWHITE : Polyline XW,Y To X,Y To X,YH
  764.       Ink VBLACK : Polyline XW,YY To XW,YH To XX,YH
  765.    Else 
  766.       Ink VWHITE : Polyline XW,Y To X,Y To X,YH
  767.       Polyline XX,YY To XX,YHL
  768.       Ink VBLACK : Polyline XW,Y To XW,YH To XX,YH
  769.       Polyline XWL,YY To XWL,YHL
  770.    End If 
  771.    '
  772. End Proc
  773. Procedure GAD_LOWERBOX_CREATE[X,Y,WIDTH,HEIGHT,STYLE]
  774.    '
  775.    XW=X+WIDTH : YH=Y+HEIGHT : XX=X+1 : YY=Y+1
  776.    XWL=X+WIDTH-1 : YHL=Y+HEIGHT-1
  777.    '
  778.    If STYLE=2 or STYLE=4
  779.       Ink VBLUE : Bar XX,YY To XWL,YHL
  780.    End If 
  781.    
  782.    Set Pattern 0
  783.    '
  784.    If STYLE<3
  785.       Ink VBLACK : Polyline XW,Y To X,Y To X,YH
  786.       Ink VWHITE : Polyline XW,YY To XW,YH To XX,YH
  787.    Else 
  788.       Ink VBLACK : Polyline XW,Y To X,Y To X,YH
  789.       Polyline XX,YY To XX,YHL
  790.       Ink VWHITE : Polyline XW,Y To XW,YH To XX,YH
  791.       Polyline XWL,YY To XWL,YHL
  792.    End If 
  793.    '
  794. End Proc
  795. '
  796. '
  797. '
  798. ' Agads2.1 procs ported into Multiwindows. (originals by me) 
  799. '    Gadgets are created on the specified window, which must be
  800. '    brought to the front. setgfx must also be called. 
  801. '     X and Y values measured from top left of specified window. 
  802. '
  803. '    Based on Agads1, used in Turboplus Sceneeditor by C.B Meeks.
  804. '
  805. Procedure GAD_BUTTON_CREATE[WINNUM,GADNUM,X,Y,HEIGHT,NAME$]
  806.    '
  807.    '
  808.    If NAME$="" Then NAME$=" "
  809.    GADTEXT$(WINNUM,GADNUM)=NAME$
  810.    '
  811.    WINZONE(WINNUM,GADNUM,0)=1
  812.    WIN_SET_ZONE[WINNUM,GADNUM,X,Y,(Len(NAME$)*8)+7,HEIGHT]
  813.    '
  814.    ' account for window position
  815.    X=X+WININFO(WINNUM,1)
  816.    Y=Y+WININFO(WINNUM,2)
  817.    
  818.    GAD_RAISEBOX_CREATE[X,Y,7+Len(NAME$)*8,HEIGHT,4]
  819.    Ink VBLACK,VGREY : Text X+4,Y+(HEIGHT/2)+3,NAME$
  820. End Proc
  821. Procedure GAD_BUTTON_IN[WINNUM,GADNUM]
  822.    '
  823.    NAME$=GADTEXT$(WINNUM,GADNUM)
  824.    '
  825.    X=WINZONE(WINNUM,GADNUM,1)+WININFO(WINNUM,1)
  826.    Y=WINZONE(WINNUM,GADNUM,2)+WININFO(WINNUM,2)
  827.    WIDTH=WINZONE(WINNUM,GADNUM,3)-X+WININFO(WINNUM,1)
  828.    HEIGHT=WINZONE(WINNUM,GADNUM,4)-Y+WININFO(WINNUM,2)
  829.    '
  830.    GAD_LOWERBOX_CREATE[X,Y,WIDTH,HEIGHT,4]
  831.    '
  832.    Ink VBLACK,VBLUE : Text X+4,Y+(HEIGHT/2)+3,NAME$
  833.    '
  834. End Proc
  835. Procedure GAD_BUTTON_OUT[WINNUM,GADNUM]
  836.    '
  837.    NAME$=GADTEXT$(WINNUM,GADNUM)
  838.    '
  839.    X=WINZONE(WINNUM,GADNUM,1)+WININFO(WINNUM,1)
  840.    Y=WINZONE(WINNUM,GADNUM,2)+WININFO(WINNUM,2)
  841.    WIDTH=WINZONE(WINNUM,GADNUM,3)-X+WININFO(WINNUM,1)
  842.    HEIGHT=WINZONE(WINNUM,GADNUM,4)-Y+WININFO(WINNUM,2)
  843.    '
  844.    GAD_RAISEBOX_CREATE[X,Y,WIDTH,HEIGHT,4]
  845.    '
  846.    Ink VBLACK,VGREY : Text X+4,Y+(HEIGHT/2)+3,NAME$
  847.    '
  848. End Proc
  849. '
  850. Procedure GAD_CYCLE_CREATE[WINNUM,GADNUM,X1,Y1,VLENGTH,VSTRING$]
  851.    
  852.    WINZONE(WINNUM,GADNUM,0)=7
  853.    WINZONE(WINNUM,GADNUM,1)=X1
  854.    WINZONE(WINNUM,GADNUM,2)=Y1
  855.    WINZONE(WINNUM,GADNUM,3)=X1+25+VLENGTH*8
  856.    WINZONE(WINNUM,GADNUM,4)=Y1+12
  857.    GADTEXT$(WINNUM,GADNUM)=""
  858.    GADSTUFF(WINNUM,GADNUM,0)=VLENGTH
  859.    GADSTUFF(WINNUM,GADNUM,1)=1
  860.    
  861.    X1=X1+WININFO(WINNUM,1)
  862.    Y1=Y1+WININFO(WINNUM,2)
  863.    
  864.    X2=X1+25+VLENGTH*8
  865.    Y2=Y1+12
  866.    
  867.    Ink VGREY : Bar X1,Y1 To X2,Y2
  868.    Rem ***** draw the outline 
  869.    Add X1,1
  870.    Ink VWHITE,VGREY
  871.     Draw X1,Y1 To X2+1,Y1
  872.     Draw X1,Y1 To X1,Y2
  873.     Draw X1-1,Y1 To X1-1,Y2
  874.    Ink VBLACK
  875.     Draw X1,Y2 To X2,Y2
  876.     Draw X2,Y1+1 To X2,Y2
  877.     Draw X2+1,Y1 To X2+1,Y2
  878.    Rem ***** draw the arrow 
  879.    Ink VWHITE
  880.     Draw X1+20,Y1+2 To X1+20,Y2-2
  881.    Ink VBLACK
  882.     Draw X1+19,Y1+2 To X1+19,Y2-2
  883.     Draw X1+6,Y1+2 To X1+13,Y1+2
  884.    Bar X1+13,Y1+3 To X1+14,Y1+6
  885.     Draw X1+11,Y1+4 To X1+16,Y1+4
  886.     Draw X1+12,Y1+5 To X1+15,Y1+5
  887.    Bar X1+5,Y1+3 To X1+6,Y2-3
  888.     Draw X1+6,Y2-2 To X1+13,Y2-2
  889.     Draw X1+13,Y2-3 To X1+14,Y2-3
  890.    
  891.    GAD_CYCLE_ADDITEM[WINNUM,GADNUM,VSTRING$]
  892.    GAD_CYCLE_SET[WINNUM,GADNUM,1]
  893.    
  894. End Proc
  895. Procedure GAD_CYCLE_PUSH[WINNUM,GADNUM]
  896.    
  897.    VLENGTH=GADSTUFF(WINNUM,GADNUM,0)
  898.    VITEM=GADSTUFF(WINNUM,GADNUM,1)
  899.    VSTRING$=GADTEXT$(WINNUM,GADNUM)
  900.    VITEMS=Len(VSTRING$)/VLENGTH
  901.    '
  902.    Add VITEM,1,1 To VITEMS
  903.    GAD_CYCLE_SET[WINNUM,GADNUM,VITEM]
  904.    '
  905. End Proc
  906. Procedure GAD_CYCLE_IN[WINNUM,GADNUM]
  907.    
  908.    WINX=WININFO(WINNUM,1)
  909.    WINY=WININFO(WINNUM,2)
  910.    
  911.    X1=WINZONE(WINNUM,GADNUM,1)+WINX
  912.    Y1=WINZONE(WINNUM,GADNUM,2)+WINY
  913.    X2=WINZONE(WINNUM,GADNUM,3)+WINX
  914.    Y2=WINZONE(WINNUM,GADNUM,4)+WINY
  915.    
  916.    VLENGTH=GADSTUFF(WINNUM,GADNUM,0)
  917.    VITEM=GADSTUFF(WINNUM,GADNUM,1)
  918.    VSTRING$=GADTEXT$(WINNUM,GADNUM)
  919.    VITEMS=Len(VSTRING$)/VLENGTH
  920.    '
  921.    Rem ***** Push the control in
  922.    Ink VBLUE
  923.    Bar X1,Y1 To X2,Y2
  924.    Ink VBLACK,VBLUE
  925.    GAD_CYCLE_SET[WINNUM,GADNUM,VITEM]
  926.     Draw X1,Y1 To X2+1,Y1
  927.     Draw X1,Y1 To X1,Y2
  928.     Draw X1-1,Y1 To X1-1,Y2
  929.    Ink VWHITE,VGREY
  930.     Draw X1,Y2 To X2,Y2
  931.     Draw X2,Y1+1 To X2,Y2
  932.     Draw X2+1,Y1 To X2+1,Y2
  933.    '
  934.    Rem ***** draw the arrow 
  935.    Ink VWHITE
  936.     Draw X1+19,Y1+2 To X1+19,Y2-2
  937.    Ink VBLACK
  938.     Draw X1+20,Y1+2 To X1+20,Y2-2
  939.     Draw X1+6,Y1+2 To X1+13,Y1+2
  940.    Bar X1+13,Y1+3 To X1+14,Y1+6
  941.     Draw X1+11,Y1+4 To X1+16,Y1+4
  942.     Draw X1+12,Y1+5 To X1+15,Y1+5
  943.    Bar X1+5,Y1+3 To X1+6,Y2-3
  944.     Draw X1+6,Y2-2 To X1+13,Y2-2
  945.     Draw X1+13,Y2-3 To X1+14,Y2-3
  946.    '
  947. End Proc
  948. Procedure GAD_CYCLE_OUT[WINNUM,GADNUM]
  949.    
  950.    WINX=WININFO(WINNUM,1)
  951.    WINY=WININFO(WINNUM,2)
  952.    
  953.    X1=WINZONE(WINNUM,GADNUM,1)+WINX
  954.    Y1=WINZONE(WINNUM,GADNUM,2)+WINY
  955.    X2=WINZONE(WINNUM,GADNUM,3)+WINX
  956.    Y2=WINZONE(WINNUM,GADNUM,4)+WINY
  957.    
  958.    VLENGTH=GADSTUFF(WINNUM,GADNUM,0)
  959.    VITEM=GADSTUFF(WINNUM,GADNUM,1)
  960.    VSTRING$=GADTEXT$(WINNUM,GADNUM)
  961.    VITEMS=Len(VSTRING$)/VLENGTH
  962.    '
  963.    Ink VGREY
  964.    Bar X1,Y1 To X2,Y2
  965.    Ink VWHITE
  966.     Draw X1,Y1 To X2+1,Y1
  967.     Draw X1,Y1 To X1,Y2
  968.     Draw X1-1,Y1 To X1-1,Y2
  969.    Ink VBLACK
  970.     Draw X1,Y2 To X2,Y2
  971.     Draw X2,Y1+1 To X2,Y2
  972.     Draw X2+1,Y1 To X2+1,Y2
  973.    '
  974.    Rem ***** draw the arrow 
  975.    Ink VWHITE
  976.     Draw X1+20,Y1+2 To X1+20,Y2-2
  977.    Ink VBLACK
  978.     Draw X1+19,Y1+2 To X1+19,Y2-2
  979.     Draw X1+6,Y1+2 To X1+13,Y1+2
  980.    Bar X1+13,Y1+3 To X1+14,Y1+6
  981.     Draw X1+11,Y1+4 To X1+16,Y1+4
  982.     Draw X1+12,Y1+5 To X1+15,Y1+5
  983.    Bar X1+5,Y1+3 To X1+6,Y2-3
  984.     Draw X1+6,Y2-2 To X1+13,Y2-2
  985.     Draw X1+13,Y2-3 To X1+14,Y2-3
  986.    '
  987.    GAD_CYCLE_SET[WINNUM,GADNUM,VITEM]
  988.    '
  989. End Proc[VITEM]
  990. Procedure GAD_CYCLE_SET[WINNUM,GADNUM,VITEM]
  991.    
  992.    X1=WINZONE(WINNUM,GADNUM,1)+WININFO(WINNUM,1)
  993.    Y1=WINZONE(WINNUM,GADNUM,2)+WININFO(WINNUM,2)
  994.    VLENGTH=GADSTUFF(WINNUM,GADNUM,0)
  995.    VSTARTPOS=(VITEM-1)*VLENGTH
  996.    If VITEM>1 : Inc VSTARTPOS : End If 
  997.    VSTRING$=Mid$(GADTEXT$(WINNUM,GADNUM),VSTARTPOS,VLENGTH)
  998.    Ink VBLACK
  999.    Text X1+23,Y1+9,VSTRING$
  1000.    GADSTUFF(WINNUM,GADNUM,1)=VITEM
  1001. End Proc[VITEM]
  1002. Procedure GAD_CYCLE_GET[WINNUM,GADNUM]
  1003.    VGETID=GADSTUFF(WINNUM,GADNUM,1)
  1004. End Proc[VGETID]
  1005. Procedure GAD_CYCLE_ADDITEM[WINNUM,GADNUM,VSTRING$]
  1006.    VOLDSTRING$=GADTEXT$(WINNUM,GADNUM)
  1007.    VLENGTH=GADSTUFF(WINNUM,GADNUM,0)
  1008.    If Len(VSTRING$)>VLENGTH
  1009.       VSTRING$=Left$(VSTRING$,VLENGTH)
  1010.    End If 
  1011.    VSTRING$=VSTRING$+Space$(VLENGTH-Len(VSTRING$))
  1012.    VNEWSTRING$=VOLDSTRING$+VSTRING$
  1013.    GADTEXT$(WINNUM,GADNUM)=VNEWSTRING$
  1014. End Proc
  1015. Procedure GAD_CYCLE_GETTEXT[WINNUM,GADNUM]
  1016.    VITEM=GADSTUFF(WINNUM,GADNUM,1)
  1017.    VLENGTH=GADSTUFF(WINNUM,GADNUM,0)
  1018.    VSTARTPOS=(VITEM-1)*VLENGTH
  1019.    If VITEM>1 : Inc VSTARTPOS : End If 
  1020.    VSTRING$=Mid$(GADTEXT$(WINNUM,GADNUM),VSTARTPOS,VLENGTH)
  1021. End Proc[VSTRING$]
  1022. '
  1023. Procedure GAD_TEXT_CREATE[WINNUM,GADNUM,X1,Y1,VSIZE,VTEXT$,VTYPE]
  1024.    
  1025.    X2=VSIZE*8+X1+7
  1026.    Y2=Y1+12
  1027.    
  1028.    WINZONE(WINNUM,GADNUM,0)=5
  1029.    WINZONE(WINNUM,GADNUM,1)=X1
  1030.    WINZONE(WINNUM,GADNUM,2)=Y1
  1031.    WINZONE(WINNUM,GADNUM,3)=X2
  1032.    WINZONE(WINNUM,GADNUM,4)=Y2
  1033.    GADSTUFF(WINNUM,GADNUM,0)=VSIZE
  1034.    GADSTUFF(WINNUM,GADNUM,1)=VTYPE
  1035.    GADTEXT$(WINNUM,GADNUM)=VTEXT$
  1036.    
  1037.    
  1038.    X1=X1+WININFO(WINNUM,1) : X2=X2+WININFO(WINNUM,1)
  1039.    Y1=Y1+WININFO(WINNUM,2) : Y2=Y2+WININFO(WINNUM,2)
  1040.    
  1041.    Ink VGREY : Bar X1,Y1 To X2,Y2
  1042.    
  1043.    Rem draw the top 
  1044.    Ink VWHITE
  1045.    Draw X1,Y1 To X2-1,Y1
  1046.    Ink VBLACK
  1047.    Draw X1+2,Y1+1 To X2-3,Y1+1
  1048.    Rem draw right side
  1049.    Ink VWHITE
  1050.    Draw X1,Y1 To X1,Y2
  1051.    Draw X1+1,Y1 To X1+1,Y2-1
  1052.    Ink VBLACK
  1053.    Draw X1+2,Y1+1 To X1+2,Y2
  1054.    Draw X1+3,Y1+1 To X1+3,Y2-2
  1055.    Rem draw bottom
  1056.    Draw X1+1,Y2 To X2,Y2
  1057.    Ink VWHITE
  1058.    Draw X1+3,Y2-1 To X2-2,Y2-1
  1059.    Rem draw left side 
  1060.    Draw X2-2,Y1 To X2-2,Y2-1
  1061.    Draw X2-3,Y1+2 To X2-3,Y2-1
  1062.    Ink VBLACK
  1063.    Draw X2-1,Y1+1 To X2-1,Y2
  1064.    Draw X2,Y1 To X2,Y2
  1065.    GAD_TEXT_SET[WINNUM,GADNUM,VTEXT$,1,0]
  1066. End Proc
  1067. Procedure GAD_TEXT_SET[WINNUM,GADNUM,VTEXT$,VSCREENPOS,VCURPOS]
  1068.    X1=WINZONE(WINNUM,GADNUM,1)+WININFO(WINNUM,1) : Y1=WINZONE(WINNUM,GADNUM,2)+WININFO(WINNUM,2)
  1069.    VSCREENSIZE=GADSTUFF(WINNUM,GADNUM,0)
  1070.    GADTEXT$(WINNUM,GADNUM)=VTEXT$
  1071.    VTEXT$=VTEXT$+" "
  1072.    VTEXT$=Mid$(VTEXT$,VSCREENPOS,Min(VSCREENSIZE,Len(VTEXT$)-VSCREENPOS+1))
  1073.    Ink VBLACK,VGREY
  1074.    Text X1+4,Y1+9,VTEXT$+Space$(VSCREENSIZE-Len(VTEXT$))
  1075.    VCURTEXT$=Mid$(VTEXT$,VCURPOS,1)
  1076.    If VCURPOS<>0
  1077.       Ink VWHITE,VBLUE
  1078.       Text X1+4+8*(VCURPOS-1),Y1+9,VCURTEXT$
  1079.    End If 
  1080. End Proc
  1081. Procedure GAD_TEXT_INPUT[WINNUM,GADNUM]
  1082.    Clear Key 
  1083.    
  1084.    VFIELD$=GADTEXT$(WINNUM,GADNUM)
  1085.    VSCREENSIZE=GADSTUFF(WINNUM,GADNUM,0)
  1086.    VTYPE=GADSTUFF(WINNUM,GADNUM,1)
  1087.    VSCREENPOS=1
  1088.    
  1089.    WINX=WININFO(WINNUM,1)
  1090.    WINY=WININFO(WINNUM,2)
  1091.    
  1092.    XPOS=WINZONE(WINNUM,GADNUM,1)+WINX
  1093.    
  1094.    TX1=WINZONE(WINNUM,GADNUM,1)+WINX
  1095.    TY1=WINZONE(WINNUM,GADNUM,2)+WINY
  1096.    TX2=WINZONE(WINNUM,GADNUM,3)+WINX
  1097.    TY2=WINZONE(WINNUM,GADNUM,4)+WINY
  1098.    '
  1099.    VMOUSEPOS=(X Screen(X Mouse)+4-XPOS)/8
  1100.    If VMOUSEPOS>VSCREENSIZE Then VMOUSEPOS=VSCREENSIZE
  1101.    If VMOUSEPOS<1 Then VMOUSEPOS=1
  1102.    If VSCREENPOS+VMOUSEPOS>Len(VFIELD$)+1 Then VMOUSEPOS=Len(VFIELD$)+1
  1103.    VCURPOS=VMOUSEPOS
  1104.    GAD_TEXT_SET[WINNUM,GADNUM,VFIELD$,1,VCURPOS]
  1105.    '
  1106.    Do 
  1107.       IN$=Inkey$ : SCAN=Scancode
  1108.       XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse)
  1109.       '
  1110.       '** Right arrow
  1111.       If SCAN=78 or ADVANCE=1
  1112.          If VCURPOS+VSCREENPOS<=Len(VFIELD$)+1
  1113.             If VCURPOS<VSCREENSIZE
  1114.                Inc VCURPOS
  1115.             Else 
  1116.                Inc VSCREENPOS
  1117.             End If 
  1118.          End If 
  1119.          If ADVANCE=1 : ADVANCE=0 : End If 
  1120.          GAD_TEXT_SET[WINNUM,GADNUM,VFIELD$,VSCREENPOS,VCURPOS]
  1121.       End If 
  1122.       '
  1123.       '** Left arrow 
  1124.       If SCAN=79 or RETREAT=1
  1125.          If VCURPOS+VSCREENPOS>2
  1126.             If VCURPOS>1
  1127.                Dec VCURPOS
  1128.             Else 
  1129.                Dec VSCREENPOS
  1130.             End If 
  1131.          End If 
  1132.          If RETREAT=1 : RETREAT=0 : End If 
  1133.          GAD_TEXT_SET[WINNUM,GADNUM,VFIELD$,VSCREENPOS,VCURPOS]
  1134.       End If 
  1135.       '
  1136.       '** Text input 
  1137.       If VTYPE=0
  1138.          If Asc(IN$)>31 and Asc(IN$)<127
  1139.             VFIELDTEMP$=Left$(VFIELD$,VSCREENPOS+VCURPOS-2)+IN$+Right$(VFIELD$,Len(VFIELD$)-(VSCREENPOS+VCURPOS-2))
  1140.             VFIELD$=VFIELDTEMP$
  1141.             ADVANCE=1
  1142.          End If 
  1143.       Else 
  1144.          If Asc(IN$)>47 and Asc(IN$)<58 or Asc(IN$)=46
  1145.             VFIELDTEMP$=Left$(VFIELD$,VSCREENPOS+VCURPOS-2)+IN$+Right$(VFIELD$,Len(VFIELD$)-(VSCREENPOS+VCURPOS-2))
  1146.             VFIELD$=VFIELDTEMP$
  1147.             ADVANCE=1
  1148.          End If 
  1149.       End If 
  1150.       '
  1151.       '** Backspace
  1152.       If SCAN=65 and VCURPOS+VSCREENPOS>2
  1153.          VFIELDTEMP$=Left$(VFIELD$,VSCREENPOS+VCURPOS-3)+Right$(VFIELD$,Len(VFIELD$)-(VSCREENPOS+VCURPOS-2))
  1154.          VFIELD$=VFIELDTEMP$
  1155.       If VSCREENPOS=1 : RETREAT=1 : Else Dec VSCREENPOS : GAD_TEXT_SET[WINNUM,GADNUM,VFIELD$,VSCREENPOS,VCURPOS] : End If 
  1156.       End If 
  1157.       '
  1158.       '** Delete 
  1159.       If SCAN=70 and VCURPOS+VSCREENPOS<=Len(VFIELD$)+1
  1160.          VFIELDTEMP$=Left$(VFIELD$,VSCREENPOS+VCURPOS-2)+Right$(VFIELD$,Len(VFIELD$)-(VSCREENPOS+VCURPOS-3)-2)
  1161.          VFIELD$=VFIELDTEMP$
  1162.          GAD_TEXT_SET[WINNUM,GADNUM,VFIELD$,VSCREENPOS,VCURPOS]
  1163.          '
  1164.       End If 
  1165.       '
  1166.       '** Mouse clicking 
  1167.       Exit If SCAN=68 or SCAN=94 or SCAN=74
  1168.       If Mouse Key=1
  1169.          If XM<TX1 or YM<TY1 or XM>TX2 or YM>TY2 : Exit : End If 
  1170.          If XM>TX1 or YM>TY1 or XM<TX2 or YM<TY2
  1171.             VMOUSEPOS=(X Screen(X Mouse)+4-XPOS)/8
  1172.             If VMOUSEPOS>VSCREENSIZE : VMOUSEPOS=VSCREENSIZE : End If 
  1173.             If VMOUSEPOS<1 : VMOUSEPOS=1 : End If 
  1174.             If VSCREENPOS+VMOUSEPOS>Len(VFIELD$)+1 : VMOUSEPOS=(Len(VFIELD$)+1)-(VSCREENPOS-1) : End If 
  1175.             VCURPOS=VMOUSEPOS
  1176.             GAD_TEXT_SET[WINNUM,GADNUM,VFIELD$,VSCREENPOS,VCURPOS]
  1177.             Repeat : Until Mouse Key=0
  1178.          End If 
  1179.       End If 
  1180.    Loop 
  1181.    GAD_TEXT_SET[WINNUM,GADNUM,VFIELD$,1,0]
  1182. End Proc[VFIELD$]
  1183. Procedure GAD_TEXT_GET[WINNUM,GADNUM]
  1184.    VTEXT$=GADTEXT$(WINNUM,GADNUM)
  1185. End Proc[VTEXT$]
  1186. Procedure GAD_TEXT_NEXT[WINNUM,GADNUM]
  1187.    VNEXTSTRINGGAD=GADNUM
  1188.    Do 
  1189.       Add VNEXTSTRINGGAD,1,1 To GADCOUNT
  1190.       GADTYPE[WINNUM,VNEXTSTRINGGAD]
  1191.       VTYPE=Param
  1192.       Exit If VTYPE=5
  1193.    Loop 
  1194. End Proc[VNEXTSTRINGGAD]
  1195. Procedure GAD_TEXT_PREV[WINNUM,GADNUM]
  1196.    VPREVSTRINGGAD=GADNUM
  1197.    Do 
  1198.       Add VPREVSTRINGGAD,-1,1 To GADCOUNT
  1199.       GADTYPE[WINNUM,VPREVSTRINGGAD]
  1200.       VTYPE=Param
  1201.       Exit If VTYPE=5
  1202.    Loop 
  1203. End Proc[VPREVSTRINGGAD]
  1204.  
  1205. Procedure GAD_DISPLAY_CREATE[WINNUM,GADNUM,X1,Y1,VLENGTH,VTEXT$]
  1206.    X2=X1+VLENGTH*8+7
  1207.    Y2=Y1+12
  1208.    
  1209.    WINZONE(WINNUM,GADNUM,0)=6
  1210.    WINZONE(WINNUM,GADNUM,1)=X1
  1211.    WINZONE(WINNUM,GADNUM,2)=Y1
  1212.    WINZONE(WINNUM,GADNUM,3)=X2
  1213.    WINZONE(WINNUM,GADNUM,4)=Y2
  1214.    GADSTUFF(WINNUM,GADNUM,0)=VLENGTH
  1215.    GADTEXT$(WINNUM,GADNUM)=VTEXT$
  1216.    
  1217.    X1=X1+WININFO(WINNUM,1) : X2=X2+WININFO(WINNUM,1)
  1218.    Y1=Y1+WININFO(WINNUM,2) : Y2=Y2+WININFO(WINNUM,2)
  1219.    
  1220.    Ink VGREY : Bar X1,Y1 To X2,Y2
  1221.    VTEXTPRINT$=Left$(VTEXT$,Min(VLENGTH,Len(VTEXT$)))
  1222.    Rem ***** draw the gadget
  1223.    Ink VBLACK
  1224.    Draw X1,Y1 To X2-1,Y1
  1225.    Bar X1,Y1 To X1+1,Y2-1
  1226.    Plot X1,Y2
  1227.    Ink VWHITE
  1228.    Draw X1+1,Y2 To X2,Y2
  1229.    Bar X2-1,Y1+1 To X2,Y2
  1230.    Plot X2,Y1
  1231.    Rem ***** fill in the text 
  1232.    Ink VBLACK,VGREY
  1233.    Text X1+4,Y1+9,VTEXTPRINT$
  1234.    
  1235. End Proc
  1236. Procedure GAD_DISPLAY_SET[WINNUM,GADNUM,VTEXT$]
  1237.    
  1238.    WINX=WININFO(WINNUM,1)
  1239.    WINY=WININFO(WINNUM,2)
  1240.    
  1241.    X1=WINZONE(WINNUM,GADNUM,1)+WINX
  1242.    Y1=WINZONE(WINNUM,GADNUM,2)+WINY
  1243.    X2=WINZONE(WINNUM,GADNUM,3)+WINX
  1244.    Y2=WINZONE(WINNUM,GADNUM,4)+WINY
  1245.    
  1246.    VDISPLAYLEN=GADSTUFF(WINNUM,GADNUM,0)
  1247.    Rem ***** clear the display
  1248.    Ink VGREY
  1249.    Bar X1+2,Y1+1 To X2-2,Y2-1
  1250.    VTEXTDISPLAY$=Left$(VTEXT$,Min(VDISPLAYLEN,Len(VTEXT$)))
  1251.    Ink VBLACK,VGREY
  1252.    Text X1+4,Y1+9,VTEXTDISPLAY$
  1253.    GADTEXT$(WINNUM,GADNUM)=VTEXT$
  1254. End Proc
  1255. Procedure GAD_DISPLAY_GET[WINNUM,GADNUM]
  1256.    GADTEXT$=GADTEXT$(WINNUM,GADNUM)
  1257. End Proc[GADTEXT$]
  1258. '
  1259. Procedure GAD_CHECKBOX_CREATE[WINNUM,GADNUM,X,Y]
  1260.    '
  1261.    WINZONE(WINNUM,GADNUM,0)=17
  1262.    WINZONE(WINNUM,GADNUM,1)=X
  1263.    WINZONE(WINNUM,GADNUM,2)=Y
  1264.    WINZONE(WINNUM,GADNUM,3)=X+25
  1265.    WINZONE(WINNUM,GADNUM,4)=Y+10
  1266.    GADSTUFF(WINNUM,GADNUM,1)=0
  1267.    '
  1268.    '
  1269.    X=X+WININFO(WINNUM,1)
  1270.    Y=Y+WININFO(WINNUM,2)
  1271.    '
  1272.    Ink VGREY
  1273.    Bar X,Y To X+25,Y+10
  1274.    '
  1275.    Ink VBLACK
  1276.    Draw X+25,Y To X+25,Y+10
  1277.    Draw X+25,Y+10 To X,Y+10
  1278.    Draw X+24,Y+1 To X+24,Y+10
  1279.    Ink VWHITE
  1280.    Draw X,Y To X+24,Y
  1281.    Draw X,Y To X,Y+10
  1282.    Draw X+1,Y To X+1,Y+9
  1283.    '
  1284. End Proc
  1285. Procedure GAD_CHECKBOX_TICK[WINNUM,GADNUM]
  1286.    X=WINZONE(WINNUM,GADNUM,1)+WININFO(WINNUM,1)
  1287.    Y=WINZONE(WINNUM,GADNUM,2)+WININFO(WINNUM,2)
  1288.    TICK=GADSTUFF(WINNUM,GADNUM,1)
  1289.    '
  1290.    '
  1291.    Restore HELLO
  1292.    If TICK=1 Then F=VGREY : NUMB=0 : Else F=VBLACK : NUMB=1
  1293.    For N=1 To 7
  1294.       For T=1 To 14
  1295.          Read A : If A=1 Then Plot T+X+6,N+Y+1,F
  1296.       Next T
  1297.    Next N
  1298.    '
  1299.    HELLO:
  1300.    Data 0,0,0,0,0,0,0,0,0,0,1,1,1,0
  1301.    Data 0,0,0,0,0,0,0,0,0,1,1,0,0,0
  1302.    Data 0,0,0,0,0,0,0,0,1,1,0,0,0,0
  1303.    Data 1,1,1,0,0,0,0,1,1,0,0,0,0,0
  1304.    Data 0,1,1,1,0,0,1,1,0,0,0,0,0,0
  1305.    Data 0,0,1,1,1,1,1,0,0,0,0,0,0,0
  1306.    Data 0,0,0,1,1,1,0,0,0,0,0,0,0,0
  1307.    '
  1308.    If NUMB=1 Then GADSTUFF(WINNUM,GADNUM,1)=1 Else GADSTUFF(WINNUM,GADNUM,1)=0
  1309.    '
  1310.    Repeat : Until Mouse Key=0
  1311. End Proc[NUMB]
  1312. '
  1313. Procedure GADTYPE[WINNUM,GADNUM]
  1314.    TYPE=WINZONE(WINNUM,GADNUM,0)
  1315. End Proc[TYPE]
  1316. '
  1317. Procedure GAD_RADIOBUT_CREATE[WINNUM,GADNUM,X,Y,GROUPNUM]
  1318.    '
  1319.    If GROUPNUM=0 Then Bell 10 : End : Rem ** NO GROUPNUM 0 ! **    
  1320.    '
  1321.    '
  1322.    WINZONE(WINNUM,GADNUM,0)=32
  1323.    WINZONE(WINNUM,GADNUM,1)=X
  1324.    WINZONE(WINNUM,GADNUM,2)=Y
  1325.    WINZONE(WINNUM,GADNUM,3)=X+18
  1326.    WINZONE(WINNUM,GADNUM,4)=Y+8
  1327.    GADSTUFF(WINNUM,GADNUM,1)=GROUPNUM
  1328.    If GADRADIO(WINNUM,GROUPNUM)>0
  1329.       GADRADIO(WINNUM,0)=1 : GAD_RADIOBUT_PUSH[WINNUM,GADNUM] : GADRADIO(WINNUM,0)=0
  1330.    Else 
  1331.       GAD_RADIOBUT_IN[WINNUM,GADNUM]
  1332.       GADRADIO(WINNUM,GROUPNUM)=GADNUM
  1333.    End If 
  1334.    '
  1335. End Proc
  1336. Procedure GAD_RADIOBUT_IN[WINNUM,GADNUM]
  1337.    '
  1338.    '
  1339.    X=WINZONE(WINNUM,GADNUM,1)+WININFO(WINNUM,1)
  1340.    Y=WINZONE(WINNUM,GADNUM,2)+WININFO(WINNUM,2)
  1341.    '
  1342.    Ink VGREY
  1343.    Bar X+3,Y+1 To X+15,Y+7
  1344.    Ink VBLACK
  1345.    Draw X+3,Y To X+15,Y
  1346.    Draw X+2,Y+1 To X+3,Y+1
  1347.    Draw X+1,Y+2 To X+1,Y+6
  1348.    Draw X+2,Y+2 To X+2,Y+6
  1349.    Draw X+2,Y+7 To X+3,Y+7
  1350.    Ink VWHITE
  1351.    Draw X+3,Y+8 To X+15,Y+8
  1352.    Draw X+15,Y+7 To X+16,Y+7
  1353.    Draw X+16,Y+2 To X+16,Y+6
  1354.    Draw X+17,Y+2 To X+17,Y+6
  1355.    Draw X+15,Y+1 To X+16,Y+1
  1356.    Ink VBLUE
  1357.    Bar X+7,Y+2 To X+11,Y+6
  1358.    Draw X+6,Y+2 To X+6,Y+6
  1359.    Draw X+5,Y+3 To X+5,Y+5
  1360.    Draw X+12,Y+2 To X+12,Y+6
  1361.    Draw X+13,Y+3 To X+13,Y+5
  1362.    '
  1363. End Proc
  1364. Procedure GAD_RADIOBUT_OUT[WINNUM,GADNUM]
  1365.    '
  1366.    '
  1367.    X=WINZONE(WINNUM,GADNUM,1)+WININFO(WINNUM,1)
  1368.    Y=WINZONE(WINNUM,GADNUM,2)+WININFO(WINNUM,2)
  1369.    '
  1370.    Ink VGREY
  1371.    Bar X+3,Y+1 To X+15,Y+7
  1372.    Ink VWHITE
  1373.    Draw X+3,Y To X+15,Y
  1374.    Draw X+2,Y+1 To X+3,Y+1
  1375.    Draw X+1,Y+2 To X+1,Y+6
  1376.    Draw X+2,Y+2 To X+2,Y+6
  1377.    Draw X+2,Y+7 To X+3,Y+7
  1378.    Ink VBLACK
  1379.    Draw X+3,Y+8 To X+15,Y+8
  1380.    Draw X+15,Y+7 To X+16,Y+7
  1381.    Draw X+16,Y+2 To X+16,Y+6
  1382.    Draw X+17,Y+2 To X+17,Y+6
  1383.    Draw X+15,Y+1 To X+16,Y+1
  1384.    '
  1385. End Proc
  1386. Procedure GAD_RADIOBUT_PUSH[WINNUM,GADNUM]
  1387.    GROUPNUM=GADSTUFF(WINNUM,GADNUM,1)
  1388.    PUSHED=GADRADIO(WINNUM,GROUPNUM)
  1389.    '
  1390.    GAD_RADIOBUT_IN[WINNUM,GADNUM]
  1391.    GADRADIO(WINNUM,GROUPNUM)=GADNUM
  1392.    If GADNUM<>PUSHED
  1393.       GAD_RADIOBUT_OUT[WINNUM,PUSHED]
  1394.    End If 
  1395.    '
  1396.    If GADRADIO(WINNUM,0)=0 Then Repeat : Until Mouse Key=0
  1397. End Proc
  1398. '
  1399. Procedure GAD_SLIDER_CREATE[WINNUM,GADNUM,X,Y,XSIZ,YSIZ,NUMSTEPS,PAGESIZE]
  1400.  
  1401.    If NUMSTEPS<1 : NUMSTEPS=1 : PAGESIZE=1 : End If 
  1402.    If PAGESIZE>NUMSTEPS : PAGESIZE=NUMSTEPS : End If 
  1403.    
  1404.    WINZONE(WINNUM,GADNUM,0)=13
  1405.    WINZONE(WINNUM,GADNUM,1)=X
  1406.    WINZONE(WINNUM,GADNUM,2)=Y+1
  1407.    WINZONE(WINNUM,GADNUM,3)=X+XSIZ-1
  1408.    WINZONE(WINNUM,GADNUM,4)=Y+YSIZ-2
  1409.    '
  1410.    Add X,WININFO(WINNUM,1)
  1411.    Add Y,WININFO(WINNUM,2)
  1412.    '
  1413.    GADSTUFF(WINNUM,GADNUM,1)=NUMSTEPS-PAGESIZE+1
  1414.    GADSTUFF(WINNUM,GADNUM,2)=PAGESIZE
  1415.    
  1416.    GADRADIO(WINNUM,GADNUM)=0
  1417.    
  1418.    PADDLESIZE=(PAGESIZE*(YSIZ-2))/NUMSTEPS
  1419.    If PADDLESIZE<6 : PADDLESIZE=6 : End If 
  1420.    GADSTUFF(WINNUM,GADNUM,3)=PADDLESIZE
  1421.    
  1422.    AREA=YSIZ-2-PADDLESIZE
  1423.    GADSTUFF(WINNUM,GADNUM,4)=AREA
  1424.    '
  1425.    GADSTUFF(WINNUM,GADNUM,5)=0
  1426.    Ink VBLACK,VBLUE : Set Pattern 2
  1427.    Bar X,Y To X+XSIZ-1,Y+YSIZ-1 : Set Pattern 0
  1428.    
  1429.    '   GAD_LOWERBOX_CREATE[X,Y,XSIZ,YSIZ,1] 
  1430.    Ink VBLACK : Polyline X+XSIZ-1,Y To X,Y To X,Y+YSIZ-1
  1431.    Ink VWHITE : Polyline X+XSIZ-1,Y+1 To X+XSIZ-1,Y+YSIZ-1 To X+1,Y+YSIZ-1
  1432.    '   GAD_RAISEBOX_CREATE[X+1,Y+1,XSIZ-2,PADDLESIZE,2] 
  1433.    Ink VGREY : Bar X+2,Y+2 To X+XSIZ-2,Y+PADDLESIZE
  1434.    Ink VWHITE : Polyline X+XSIZ-2,Y+1 To X+1,Y+1 To X+1,Y+PADDLESIZE
  1435.    Ink VBLACK : Polyline X+XSIZ-2,Y+2 To X+XSIZ-2,Y+PADDLESIZE To X+2,Y+PADDLESIZE
  1436.    
  1437.    SEP=Y+(PADDLESIZE/2)
  1438.    Ink VWHITE : Draw X+7,SEP To X+XSIZ-8,SEP
  1439.    Ink VBLACK : Draw X+7,SEP+1 To X+XSIZ-8,SEP+1
  1440.    
  1441.    GADSTUFF(WINNUM,GADNUM,6)=0
  1442.    '   GAD_SLIDER_UPDATE[GADNUM,10] 
  1443.    
  1444. End Proc
  1445. Procedure GAD_SLIDER_UPDATE[WINNUM,GADNUM,STP]
  1446.    
  1447.    OSTP=GADSTUFF(WINNUM,GADNUM,5)
  1448.    If OSTP<>STP
  1449.       
  1450.       X=WINZONE(WINNUM,GADNUM,1)+1
  1451.       X2=WINZONE(WINNUM,GADNUM,3)-1
  1452.       Y=WINZONE(WINNUM,GADNUM,2)
  1453.       
  1454.       Add X,WININFO(WINNUM,1)
  1455.       Add X2,WININFO(WINNUM,1)
  1456.       Add Y,WININFO(WINNUM,2)
  1457.       
  1458.       AREA=GADSTUFF(WINNUM,GADNUM,4)
  1459.       NUMSTEPS=GADSTUFF(WINNUM,GADNUM,1)
  1460.       PADSIZE=GADSTUFF(WINNUM,GADNUM,3)
  1461.       
  1462.       SPOS=Y+(AREA*STP)/(NUMSTEPS-1)
  1463.       OPOS=Y+(AREA*OSTP)/(NUMSTEPS-1)
  1464.       If OPOS<>SPOS
  1465.          
  1466.          HP=(PADSIZE/2) : SEP=OPOS+HP-1
  1467.          Ink VGREY : Box X+6,SEP To X2-6,SEP+1
  1468.          
  1469.          If SPOS>OPOS
  1470.             Ink VGREY : Bar X,OPOS+PADSIZE-2 To X2,SPOS+PADSIZE-1
  1471.             Ink VBLACK,VBLUE : Set Pattern 2
  1472.             Bar X,OPOS To X2,SPOS : Set Pattern 0
  1473.          Else 
  1474.             Ink VGREY : Bar X,SPOS To X2,OPOS+1
  1475.             Ink VBLACK,VBLUE : Set Pattern 2
  1476.             Bar X,SPOS+PADSIZE-1 To X2,OPOS+PADSIZE-1 : Set Pattern 0
  1477.          End If 
  1478.          '         GAD_RAISEBOX_CREATE[X,SPOS,X2-X+1,PADSIZE,1] 
  1479.          XL=X2-X : YL=SPOS+PADSIZE-1
  1480.          Ink VWHITE : Polyline X+XL,SPOS To X,SPOS To X,YL
  1481.          Ink VBLACK : Polyline X+XL,SPOS+1 To X+XL,YL To X+1,YL
  1482.          
  1483.          SEP=SPOS+HP-1
  1484.          Ink VWHITE : Draw X+6,SEP To X2-6,SEP
  1485.          Ink VBLACK : Draw X+6,SEP+1 To X2-6,SEP+1
  1486.          
  1487.       End If 
  1488.       GADSTUFF(WINNUM,GADNUM,5)=STP
  1489.       GADSTUFF(WINNUM,GADNUM,6)=SPOS-Y
  1490.    End If 
  1491. End Proc
  1492. Procedure GAD_SLIDER_MOUSE_UPDATE[WINNUM,GADNUM]
  1493.    
  1494.    NUMSTEPS=GADSTUFF(WINNUM,GADNUM,1)
  1495.    STP=GADSTUFF(WINNUM,GADNUM,5)
  1496.    If NUMSTEPS>1
  1497.       
  1498.       X=WINZONE(WINNUM,GADNUM,1)+1
  1499.       X2=WINZONE(WINNUM,GADNUM,3)-1
  1500.       Y=WINZONE(WINNUM,GADNUM,2)
  1501.  
  1502.    Add X,WININFO(WINNUM,1)
  1503.    Add X2,WININFO(WINNUM,1)
  1504.    Add Y,WININFO(WINNUM,2)
  1505.  
  1506.       PAGESIZE=GADSTUFF(WINNUM,GADNUM,2)
  1507.       AREA=GADSTUFF(WINNUM,GADNUM,4)
  1508.       PADSIZE=GADSTUFF(WINNUM,GADNUM,3)
  1509.       
  1510.       OPOS=GADSTUFF(WINNUM,GADNUM,6)+Y
  1511.       SPOS=Y Screen(Y Mouse)
  1512.       
  1513.       If SPOS<OPOS and GADRADIO(WINNUM,GADNUM)=0
  1514.          
  1515.          Add STP,1-PAGESIZE
  1516.          If STP<0 : STP=0 : End If 
  1517.          SPOS=Y+(AREA*STP)/(NUMSTEPS-1)
  1518.          Repeat : Until Mouse Key=0
  1519.          
  1520.       Else If SPOS>OPOS+PADSIZE-1 and GADRADIO(WINNUM,GADNUM)=0
  1521.          
  1522.          Add STP,PAGESIZE-1
  1523.          If STP>NUMSTEPS-1 : STP=NUMSTEPS-1 : End If 
  1524.          SPOS=Y+(AREA*STP)/(NUMSTEPS-1)
  1525.          Repeat : Until Mouse Key=0
  1526.          
  1527.       Else 
  1528.          If GADRADIO(WINNUM,GADNUM)=0
  1529.             GAP=SPOS-OPOS
  1530.          Else 
  1531.             GAP=GADRADIO(WINNUM,GADNUM)-1
  1532.          End If 
  1533.          '
  1534.          Do 
  1535.             SPOS=Y Screen(Y Mouse)-GAP
  1536.             If SPOS>Y+AREA
  1537.                SPOS=Y+AREA
  1538.             Else If SPOS<Y
  1539.                SPOS=Y
  1540.             End If 
  1541.             If SPOS<>OPOS
  1542.                
  1543.                GADRADIO(WINNUM,GADNUM)=GAP+1
  1544.                STP=((SPOS-Y)*NUMSTEPS)/AREA
  1545.                If STP>NUMSTEPS-1 : STP=NUMSTEPS-1 : End If 
  1546.                Exit 
  1547.                
  1548.             Else If Mouse Key=0
  1549.                If GADRADIO(WINNUM,GADNUM)=0
  1550.                   If GAP>(PADSIZE/2)-1
  1551.                      Inc STP
  1552.                      If STP>(NUMSTEPS-1)
  1553.                         STP=(NUMSTEPS-1)
  1554.                      End If 
  1555.                   Else 
  1556.                      Dec STP
  1557.                      If STP<0
  1558.                         STP=0
  1559.                      End If 
  1560.                   End If 
  1561.                   SPOS=Y+(AREA*STP)/(NUMSTEPS-1)
  1562.                   Y Mouse=Y Hard(SPOS+GAP)
  1563.                End If 
  1564.                GADRADIO(WINNUM,GADNUM)=0
  1565.                Exit 
  1566.             End If 
  1567.          Loop 
  1568.          
  1569.       End If 
  1570.       
  1571.       If SPOS<>OPOS
  1572.          HP=(PADSIZE/2) : SEP=OPOS+HP-1
  1573.          Ink VGREY : Box X+6,SEP To X2-6,SEP+1
  1574.          If SPOS>OPOS
  1575.             Ink VGREY : Bar X,OPOS+PADSIZE-2 To X2,SPOS+PADSIZE-1
  1576.             Ink VBLACK,VBLUE : Set Pattern 2
  1577.             Bar X,OPOS To X2,SPOS : Set Pattern 0
  1578.          Else 
  1579.             Ink VGREY : Bar X,SPOS To X2,OPOS+1
  1580.             Ink VBLACK,VBLUE : Set Pattern 2
  1581.             Bar X,SPOS+PADSIZE-1 To X2,OPOS+PADSIZE-1 : Set Pattern 0
  1582.          End If 
  1583.          '      GAD_RAISEBOX_CREATE[X,SPOS,X2-X+1,PADSIZE,1]
  1584.          'XL=X2-X 
  1585.          '   Ink VWHITE : Polyline X+XL,SPOS To X,SPOS To X,SPOS+PADSIZE-1
  1586.          '   Ink VBLACK : Polyline X+XL,SPOS+1 To X+XL,SPOS+PADSIZE-1 To X+1,SPOS+PADSIZE-1 
  1587.          
  1588.          XL=X2-X : YL=SPOS+PADSIZE-1
  1589.          Ink VWHITE : Polyline X+XL,SPOS To X,SPOS To X,YL
  1590.          Ink VBLACK : Polyline X+XL,SPOS+1 To X+XL,YL To X+1,YL
  1591.          
  1592.          SEP=SPOS+HP-1
  1593.          Ink VWHITE : Draw X+6,SEP To X2-6,SEP
  1594.          Ink VBLACK : Draw X+6,SEP+1 To X2-6,SEP+1
  1595.          
  1596.       End If 
  1597.       
  1598.       GADSTUFF(WINNUM,GADNUM,5)=STP
  1599.       GADSTUFF(WINNUM,GADNUM,6)=SPOS-Y
  1600.    End If 
  1601. End Proc[STP]
  1602. '  Horizontal sliders have a small issue in hires, due to the
  1603. '   low res pointer. Not a bug! - too insignificant to be worth  
  1604. '   fixing!  
  1605. Procedure GAD_HSLIDER_CREATE[WINNUM,GADNUM,X,Y,XSIZ,YSIZ,NUMSTEPS,PAGESIZE]
  1606.  
  1607.    If NUMSTEPS<1 : NUMSTEPS=1 : PAGESIZE=1 : End If 
  1608.    If PAGESIZE>NUMSTEPS : PAGESIZE=NUMSTEPS : End If 
  1609.    
  1610.    WINZONE(WINNUM,GADNUM,0)=15
  1611.    WINZONE(WINNUM,GADNUM,1)=X+1
  1612.    WINZONE(WINNUM,GADNUM,2)=Y
  1613.    WINZONE(WINNUM,GADNUM,3)=X+XSIZ-2
  1614.    WINZONE(WINNUM,GADNUM,4)=Y+YSIZ-1
  1615.    '
  1616.    Add X,WININFO(WINNUM,1)
  1617.    Add Y,WININFO(WINNUM,2)
  1618. '
  1619.    GADSTUFF(WINNUM,GADNUM,1)=NUMSTEPS-PAGESIZE+1
  1620.    GADSTUFF(WINNUM,GADNUM,2)=PAGESIZE
  1621.    
  1622.    GADRADIO(WINNUM,GADNUM)=0
  1623.    
  1624.    PADDLESIZE=(PAGESIZE*(XSIZ-2))/NUMSTEPS
  1625.    If PADDLESIZE<6 : PADDLESIZE=6 : End If 
  1626.    GADSTUFF(WINNUM,GADNUM,3)=PADDLESIZE
  1627.    
  1628.    AREA=XSIZ-2-PADDLESIZE
  1629.    GADSTUFF(WINNUM,GADNUM,4)=AREA
  1630.    '
  1631.    GADSTUFF(WINNUM,GADNUM,5)=0
  1632.    Ink VBLACK,VBLUE : Set Pattern 2
  1633.    Bar X,Y To X+XSIZ-1,Y+YSIZ-1 : Set Pattern 0
  1634.    
  1635.    '   GAD_LOWERBOX_CREATE[X,Y,XSIZ,YSIZ,1] 
  1636.    Ink VBLACK : Polyline X+XSIZ-1,Y To X,Y To X,Y+YSIZ-1
  1637.    Ink VWHITE : Polyline X+XSIZ-1,Y+1 To X+XSIZ-1,Y+YSIZ-1 To X+1,Y+YSIZ-1
  1638.    '   GAD_RAISEBOX_CREATE[X+1,Y+1,XSIZ-2,PADDLESIZE,2] 
  1639.    Ink VGREY : Bar X+2,Y+2 To X+PADDLESIZE,Y+YSIZ-2
  1640.    Ink VWHITE : Polyline X+1,Y+YSIZ-2 To X+1,Y+1 To X+PADDLESIZE,Y+1
  1641.    Ink VBLACK : Polyline X+2,Y+YSIZ-2 To X+PADDLESIZE,Y+YSIZ-2 To X+PADDLESIZE,Y+2
  1642.    
  1643.    SEP=X+(PADDLESIZE/2)
  1644.    Ink VWHITE : Draw SEP,Y+7 To SEP,Y+YSIZ-8
  1645.    Ink VBLACK : Draw SEP+1,Y+7 To SEP+1,Y+YSIZ-8
  1646.    
  1647.    GADSTUFF(WINNUM,GADNUM,6)=0
  1648.    '   GAD_SLIDER_UPDATE[GADNUM,10] 
  1649.    
  1650. End Proc
  1651. Procedure GAD_HSLIDER_UPDATE[WINNUM,GADNUM,STP]
  1652.    
  1653.    OSTP=GADSTUFF(WINNUM,GADNUM,5)
  1654.    If OSTP<>STP
  1655.       
  1656.       X=WINZONE(WINNUM,GADNUM,1)
  1657.       Y=WINZONE(WINNUM,GADNUM,2)+1
  1658.       Y2=WINZONE(WINNUM,GADNUM,4)-1
  1659.  
  1660.    Add X,WININFO(WINNUM,1)
  1661.    Add Y,WININFO(WINNUM,2)
  1662.    Add Y2,WININFO(WINNUM,2)
  1663.  
  1664.       AREA=GADSTUFF(WINNUM,GADNUM,4)
  1665.       NUMSTEPS=GADSTUFF(WINNUM,GADNUM,1)
  1666.       PADSIZE=GADSTUFF(WINNUM,GADNUM,3)
  1667.       
  1668.       SPOS=X+(AREA*STP)/(NUMSTEPS-1)
  1669.       OPOS=X+(AREA*OSTP)/(NUMSTEPS-1)
  1670.       If OPOS<>SPOS
  1671.          
  1672.          HP=(PADSIZE/2) : SEP=OPOS+HP-1
  1673.          Ink VGREY : Box SEP,Y+6 To SEP+1,Y2-6
  1674.          
  1675.          If SPOS>OPOS
  1676.             Ink VGREY : Bar OPOS+PADSIZE-2,Y To SPOS+PADSIZE-1,Y2
  1677.             Ink VBLACK,VBLUE : Set Pattern 2
  1678.             Bar OPOS,Y To SPOS,Y2 : Set Pattern 0
  1679.          Else 
  1680.             Ink VGREY : Bar SPOS,Y To OPOS+1,Y2
  1681.             Ink VBLACK,VBLUE : Set Pattern 2
  1682.             Bar SPOS+PADSIZE-1,Y To OPOS+PADSIZE-1,Y2 : Set Pattern 0
  1683.          End If 
  1684.          '         GAD_RAISEBOX_CREATE[X,SPOS,X2-X+1,PADSIZE,1] 
  1685.          YL=Y2-Y : XL=SPOS+PADSIZE-1
  1686.          Ink VWHITE : Polyline SPOS,Y+YL To SPOS,Y To XL,Y
  1687.          Ink VBLACK : Polyline SPOS+1,Y+YL To XL,Y+YL To XL,Y+1
  1688.          
  1689.          SEP=SPOS+HP-1
  1690.          Ink VWHITE : Draw SEP,Y+6 To SEP,Y2-6
  1691.          Ink VBLACK : Draw SEP+1,Y+6 To SEP+1,Y2-6
  1692.          
  1693.       End If 
  1694.       GADSTUFF(WINNUM,GADNUM,5)=STP
  1695.       GADSTUFF(WINNUM,GADNUM,6)=SPOS-X
  1696.    End If 
  1697. End Proc
  1698. Procedure GAD_HSLIDER_MOUSE_UPDATE[WINNUM,GADNUM]
  1699.    
  1700.    NUMSTEPS=GADSTUFF(WINNUM,GADNUM,1)
  1701.    STP=GADSTUFF(WINNUM,GADNUM,5)
  1702.    If NUMSTEPS>1
  1703.       
  1704.       X=WINZONE(WINNUM,GADNUM,1)
  1705.       Y=WINZONE(WINNUM,GADNUM,2)+1
  1706.       Y2=WINZONE(WINNUM,GADNUM,4)-1
  1707.  
  1708.    Add X,WININFO(WINNUM,1)
  1709.    Add Y,WININFO(WINNUM,2)
  1710.    Add Y2,WININFO(WINNUM,2)
  1711.  
  1712.       PAGESIZE=GADSTUFF(WINNUM,GADNUM,2)
  1713.       AREA=GADSTUFF(WINNUM,GADNUM,4)
  1714.       PADSIZE=GADSTUFF(WINNUM,GADNUM,3)
  1715.       
  1716.       OPOS=GADSTUFF(WINNUM,GADNUM,6)+X
  1717.       SPOS=X Screen(X Mouse)
  1718.       
  1719.       If SPOS<OPOS and GADRADIO(WINNUM,GADNUM)=0
  1720.          
  1721.          Add STP,1-PAGESIZE
  1722.          If STP<0 : STP=0 : End If 
  1723.          SPOS=X+(AREA*STP)/(NUMSTEPS-1)
  1724.          Repeat : Until Mouse Key=0
  1725.          
  1726.       Else If SPOS>OPOS+PADSIZE-1 and GADRADIO(WINNUM,GADNUM)=0
  1727.          
  1728.          Add STP,PAGESIZE-1
  1729.          If STP>NUMSTEPS-1 : STP=NUMSTEPS-1 : End If 
  1730.          SPOS=X+(AREA*STP)/(NUMSTEPS-1)
  1731.          Repeat : Until Mouse Key=0
  1732.          
  1733.       Else 
  1734.          If GADRADIO(WINNUM,GADNUM)=0
  1735.             GAP=SPOS-OPOS
  1736.          Else 
  1737.             GAP=GADRADIO(WINNUM,GADNUM)-1
  1738.          End If 
  1739.          '
  1740.          Do 
  1741.             SPOS=X Screen(X Mouse)-GAP
  1742.             If SPOS>X+AREA
  1743.                SPOS=X+AREA
  1744.             Else If SPOS<X
  1745.                SPOS=X
  1746.             End If 
  1747.             If SPOS<>OPOS
  1748.                
  1749.                GADRADIO(WINNUM,GADNUM)=GAP+1
  1750.                STP=((SPOS-X)*NUMSTEPS)/AREA
  1751.                If STP>NUMSTEPS-1 : STP=NUMSTEPS-1 : End If 
  1752.                Exit 
  1753.                
  1754.             Else If Mouse Key=0
  1755.                If GADRADIO(WINNUM,GADNUM)=0
  1756.                   If GAP>(PADSIZE/2)-1
  1757.                      Inc STP
  1758.                      If STP>(NUMSTEPS-1)
  1759.                         STP=(NUMSTEPS-1)
  1760.                      End If 
  1761.                   Else 
  1762.                      Dec STP
  1763.                      If STP<0
  1764.                         STP=0
  1765.                      End If 
  1766.                   End If 
  1767.                   SPOS=X+(AREA*STP)/(NUMSTEPS-1)
  1768.                   X Mouse=X Hard(SPOS+GAP)
  1769.                End If 
  1770.                GADRADIO(WINNUM,GADNUM)=0
  1771.                Exit 
  1772.             End If 
  1773.          Loop 
  1774.          
  1775.       End If 
  1776.  
  1777.       If OPOS<>SPOS
  1778.          
  1779.          HP=(PADSIZE/2) : SEP=OPOS+HP-1
  1780.          Ink VGREY : Box SEP,Y+6 To SEP+1,Y2-6
  1781.          
  1782.          If SPOS>OPOS
  1783.             Ink VGREY : Bar OPOS+PADSIZE-2,Y To SPOS+PADSIZE-1,Y2
  1784.             Ink VBLACK,VBLUE : Set Pattern 2
  1785.             Bar OPOS,Y To SPOS,Y2 : Set Pattern 0
  1786.          Else 
  1787.             Ink VGREY : Bar SPOS,Y To OPOS+1,Y2
  1788.             Ink VBLACK,VBLUE : Set Pattern 2
  1789.             Bar SPOS+PADSIZE-1,Y To OPOS+PADSIZE-1,Y2 : Set Pattern 0
  1790.          End If 
  1791.          '         GAD_RAISEBOX_CREATE[X,SPOS,X2-X+1,PADSIZE,1] 
  1792.          YL=Y2-Y : XL=SPOS+PADSIZE-1
  1793.          Ink VWHITE : Polyline SPOS,Y+YL To SPOS,Y To XL,Y
  1794.          Ink VBLACK : Polyline SPOS+1,Y+YL To XL,Y+YL To XL,Y+1
  1795.          
  1796.          SEP=SPOS+HP-1
  1797.          Ink VWHITE : Draw SEP,Y+6 To SEP,Y2-6
  1798.          Ink VBLACK : Draw SEP+1,Y+6 To SEP+1,Y2-6
  1799.          
  1800.       End If 
  1801.       
  1802.       GADSTUFF(WINNUM,GADNUM,5)=STP
  1803.       GADSTUFF(WINNUM,GADNUM,6)=SPOS-X
  1804.    End If 
  1805. End Proc[STP]
  1806. '
  1807. ' Below uses an old system, used in my old sliders. Use scrolloff
  1808. '  to deactivate the buttons after they have been used.
  1809. Procedure GAD_SCROLLBUT_CREATE[WINNUM,GADNUM,X,Y]
  1810.    '
  1811.    WINZONE(WINNUM,GADNUM,0)=34
  1812.    WINZONE(WINNUM,GADNUM,1)=X
  1813.    WINZONE(WINNUM,GADNUM,2)=Y
  1814.    WINZONE(WINNUM,GADNUM,3)=X+34
  1815.    WINZONE(WINNUM,GADNUM,4)=Y+12
  1816.    '
  1817.    X=X+WININFO(WINNUM,1)
  1818.    Y=Y+WININFO(WINNUM,2)
  1819.    
  1820.    GAD_RAISEBOX_CREATE[X,Y,15,12,4]
  1821.    GAD_RAISEBOX_CREATE[X+17,Y,15,12,4]
  1822.    '
  1823.    Ink VBLACK,VGREY
  1824.    Text X+4,Y+9,"<"
  1825.    Text X+21,Y+9,">"
  1826.    '
  1827. End Proc
  1828. Procedure GAD_SCROLLBUT_UPDATE[WINNUM,GADNUM]
  1829.    '
  1830.    WINX=WININFO(WINNUM,1)
  1831.    WINY=WININFO(WINNUM,2)
  1832.    X=WINZONE(WINNUM,GADNUM,1)+WINX
  1833.    Y=WINZONE(WINNUM,GADNUM,2)+WINY
  1834.    '
  1835.    If GADSTUFF(WINNUM,GADNUM,0)<>1
  1836.       If X Screen(X Mouse)<X+15
  1837.          If GADSTUFF(WINNUM,GADNUM,0)=2
  1838.             GAD_SCROLLBUT_OUT[WINNUM,GADNUM,2]
  1839.          End If 
  1840.          GAD_LOWERBOX_CREATE[X,Y,15,12,4]
  1841.          Ink VWHITE,VBLUE
  1842.          Text X+4,Y+9,"<"
  1843.          GADSTUFF(WINNUM,GADNUM,0)=1
  1844.       End If 
  1845.       Inc GADSTUFF(WINNUM,GADNUM,1)
  1846.    End If 
  1847.    If GADSTUFF(WINNUM,GADNUM,0)<>2
  1848.       If X Screen(X Mouse)=>X+15
  1849.          If GADSTUFF(WINNUM,GADNUM,0)=1
  1850.             GAD_SCROLLBUT_OUT[WINNUM,GADNUM,1]
  1851.          End If 
  1852.          GAD_LOWERBOX_CREATE[X+17,Y,15,12,4]
  1853.          Ink VWHITE,VBLUE
  1854.          Text X+21,Y+9,">"
  1855.          GADSTUFF(WINNUM,GADNUM,0)=2
  1856.       End If 
  1857.       Dec GADSTUFF(WINNUM,GADNUM,1)
  1858.    End If 
  1859.    '
  1860.    '
  1861.    FIN:
  1862. End Proc[GADSTUFF(WINNUM,GADNUM,1)]
  1863. Procedure GAD_SCROLLOFF[WINNUM,GADNUM]
  1864.    GAD_SCROLLBUT_OUT[WINNUM,GADNUM,GADSTUFF(WINNUM,GADNUM,0)]
  1865.    GADSTUFF(WINNUM,GADNUM,0)=0
  1866. End Proc
  1867. Procedure GAD_SCROLLBUT_OUT[WINNUM,GADNUM,BUTTON]
  1868.    '
  1869.    WINX=WININFO(WINNUM,1)
  1870.    WINY=WININFO(WINNUM,2)
  1871.    X=WINZONE(WINNUM,GADNUM,1)+WINX
  1872.    Y=WINZONE(WINNUM,GADNUM,2)+WINY
  1873.    If BUTTON=1
  1874.       GAD_RAISEBOX_CREATE[X,Y,15,12,4]
  1875.       Ink VBLACK,VGREY
  1876.       Text X+4,Y+9,"<"
  1877.    Else If BUTTON=2
  1878.       GAD_RAISEBOX_CREATE[X+17,Y,15,12,4]
  1879.       Ink VBLACK,VGREY
  1880.       Text X+21,Y+9,">"
  1881.    End If 
  1882. End Proc
  1883. Procedure GAD_SCROLLBUT_SET[WINNUM,GADNUM,SVALUE]
  1884.    GADSTUFF(WINNUM,GADNUM,1)=SVALUE
  1885. End Proc[SVALUE]
  1886. '
  1887. Procedure GAD_SBUT_CREATE[WINNUM,GADNUM,X,Y,WIDTH,HEIGHT,STYLE]
  1888.    '
  1889.    If STYLE>2 Then Dec WIDTH
  1890.    '
  1891.    WINZONE(WINNUM,GADNUM,0)=20
  1892.    WINZONE(WINNUM,GADNUM,1)=X
  1893.    WINZONE(WINNUM,GADNUM,2)=Y
  1894.    WINZONE(WINNUM,GADNUM,3)=X+WIDTH
  1895.    WINZONE(WINNUM,GADNUM,4)=Y+HEIGHT
  1896.    GADSTUFF(WINNUM,GADNUM,1)=STYLE
  1897.    '
  1898.    X=X+WININFO(WINNUM,1)
  1899.    Y=Y+WININFO(WINNUM,2)
  1900.    GAD_RAISEBOX_CREATE[X,Y,WIDTH,HEIGHT,STYLE]
  1901.    '
  1902. End Proc
  1903. Procedure GAD_SBUT_IN[WINNUM,GADNUM]
  1904.    '
  1905.    X=WINZONE(WINNUM,GADNUM,1)
  1906.    Y=WINZONE(WINNUM,GADNUM,2)
  1907.    WIDTH=WINZONE(WINNUM,GADNUM,3)-X
  1908.    HEIGHT=WINZONE(WINNUM,GADNUM,4)-Y
  1909.    STYLE=GADSTUFF(WINNUM,GADNUM,1)
  1910.    '
  1911.    X=X+WININFO(WINNUM,1)
  1912.    Y=Y+WININFO(WINNUM,2)
  1913.    GAD_LOWERBOX_CREATE[X,Y,WIDTH,HEIGHT,STYLE]
  1914.    '
  1915. End Proc
  1916. Procedure GAD_SBUT_OUT[WINNUM,GADNUM]
  1917.    '
  1918.    X=WINZONE(WINNUM,GADNUM,1)
  1919.    Y=WINZONE(WINNUM,GADNUM,2)
  1920.    WIDTH=WINZONE(WINNUM,GADNUM,3)-X
  1921.    HEIGHT=WINZONE(WINNUM,GADNUM,4)-Y
  1922.    STYLE=GADSTUFF(WINNUM,GADNUM,1)
  1923.    '
  1924.    X=X+WININFO(WINNUM,1)
  1925.    Y=Y+WININFO(WINNUM,2)
  1926.    '
  1927.    GAD_RAISEBOX_CREATE[X,Y,WIDTH,HEIGHT,STYLE]
  1928.    '
  1929. End Proc
  1930. '
  1931. '
  1932. ' **Warning - Both file selector and gad_request use the very last window
  1933. '             id number. If there is a window there it will be destroyed.
  1934. '             Leave the last window free if you intend to use these procs! 
  1935. '
  1936. Procedure WIN_FILE_SELECTOR[X,Y,WIDTH,TITLE$]
  1937.    '
  1938.    ' Hastily converted from my agads2. Dev next$ kept hanging my machine, 
  1939.    ' so I put this crappy devs thing in instead. To get into your 
  1940.    ' harddrive, type the device name in the top text gadget.
  1941.    '  
  1942.    '
  1943.    WIDTH=WIDTH*8 : FILETEMP=0 : WC=WINCOUNT
  1944.    
  1945.    '
  1946.    WIN_CREATE[WC,X,Y,WIDTH+7,134,0,0,0,0]
  1947.    WIN_FRAMEWORK[WC,2,0,VDGREY,0,TITLE$]
  1948.    
  1949.    GAD_RAISEBOX_CREATE[X+4,Y+15,WIDTH,117,4]
  1950.    GAD_LOWERBOX_CREATE[X+10,Y+18,WIDTH-117,110,4]
  1951. '   GAD_VSLIDER_CREATE[WC,11,WIDTH-103,18,20,90,0,9] 
  1952. '   GAD_VSLIDEBUT_CREATE[WC,12,11] 
  1953.    '
  1954.    GAD_BUTTON_CREATE[WC,13,WIDTH-75,18,11," PARENT "]
  1955.    GAD_BUTTON_CREATE[WC,14,WIDTH-75,31,11,"  DEVS  "]
  1956.    GAD_BUTTON_CREATE[WC,5,WIDTH-75,104,11,"   OK   "]
  1957.    GAD_BUTTON_CREATE[WC,6,WIDTH-75,117,11," CANCEL "]
  1958.    GAD_CHECKBOX_CREATE[WC,10,WIDTH-75,65] : GAD_CHECKBOX_TICK[WC,10]
  1959.    Ink VBLACK : Text X+WIDTH-43,Y+73,"SIZES"
  1960.    '
  1961.    GAD_TEXT_CREATE[WC,7,12,19,(WIDTH/8)-16,Dir$,0]
  1962.    GAD_TEXT_CREATE[WC,8,12,115,(WIDTH/8)-16,"",0]
  1963.    '   Look 'ere ... a custom zone! 
  1964.    WINZONE(WC,9,1)=12 : WINZONE(WC,9,2)=33
  1965.    WINZONE(WC,9,3)=WIDTH-109 : WINZONE(WC,9,4)=112
  1966.    '
  1967.    DPOS=0 : SIZE=1 : SELECTED=-1
  1968.    WIN_SETGFX[WC]
  1969.    '
  1970.    If FILELIST$(0)=""
  1971.       If Dir$=""
  1972.          Gosub FINDDEVS
  1973.       Else 
  1974.          Gosub FINDDIR
  1975.       End If 
  1976.    Else 
  1977.       Gosub RETREIVEDIR
  1978.    End If 
  1979.    '
  1980.    '
  1981.    Do 
  1982.       
  1983.       WINSCAN : BUTTON=Param
  1984.       If WINSELECTED=WC
  1985.          X=WININFO(WC,1) : Y=WININFO(WC,2)
  1986.          
  1987.          If BUTTON=11 : Repeat : Wait Vbl : GAD_SLIDER_MOUSE_UPDATE[WC,11] : DPOS=Param : Gosub DISPDIR : Until Mouse Key=0 : End If 
  1988. '         If BUTTON=12 : Repeat : GAD_VSLIDEBUT_UPDATE[WC,12] : DPOS=Param : Gosub DISPDIR : Until Mouse Key=0 : GAD_SLIDEOFF[WC,12] : End If  
  1989.          If BUTTON=13 : Parent : Gosub FINDDIR : End If 
  1990.          If BUTTON=14 or Mouse Key=2 : Repeat : Until Mouse Key=0 : Gosub FINDDEVS : BUTTON=0 : End If 
  1991.          If BUTTON=9 : Gosub SELECTFILE : End If 
  1992.       If BUTTON=7 : GAD_TEXT_INPUT[WC,7] : TEMP$=Param$ : If Exist(TEMP$) : Dir$=TEMP$ : Gosub FINDDIR : Else GAD_TEXT_SET[WC,7,Dir$,0,0] : End If : End If 
  1993.          If BUTTON=8 : GAD_TEXT_INPUT[WC,8] : TEMP$=Param$ : If TEMP$<>"" : Goto LFILE : End If : End If 
  1994.          If BUTTON=5 : TEMP$=GADTEXT$(WC,8) : Gosub STRIPTEMP : Goto LFILE : End If 
  1995.          If BUTTON=6 or WINCLOSED : OUT$="" : Goto QUITIT : End If 
  1996.          If BUTTON=10 : GAD_CHECKBOX_TICK[WC,10] : SIZE=Param : Gosub DISPDIR : End If 
  1997.          If FILETEMP=1 : Goto LFILE : End If 
  1998.          If X Screen(X Mouse)>X+12 and Y Screen(Y Mouse)>Y+33 and X Screen(X Mouse)<X+WIDTH-109 and Y Screen(Y Mouse)<Y+113
  1999.             SELECTED=((Y Screen(Y Mouse)-(Y+33))/8)+DPOS
  2000.          Else SELECTED=-1
  2001.          End If 
  2002.          Gosub DISPDIR
  2003.       End If 
  2004.    Loop 
  2005.    '
  2006.    '
  2007.    FINDDEVS:
  2008.    For N=0 To 300
  2009.       FILELIST$(N)=""
  2010.    Next N
  2011.    N=0 : F=0 : DPOS=0
  2012.    Restore DEVDATA
  2013.    While F<17
  2014.       Read DE$
  2015.       If Exist(Right$(DE$,Len(DE$)-1))
  2016.          FILELIST$(N)=DE$+Space$(((WIDTH/8)-15)-Len(DE$))
  2017.          Inc N
  2018.       End If 
  2019.       Inc F
  2020.    Wend 
  2021.    GAD_SLIDER_CREATE[WC,11,WIDTH-103,18,20,111,N,10] : N=0
  2022.    Ink VBLUE
  2023.    Bar X+12,Y+33 To X+WIDTH-109,Y+113
  2024.    Gosub DISPDIR
  2025.    Return 
  2026.    '
  2027.    '
  2028.    DEVDATA:
  2029.    Data "#DF0:","#DF1:","#DF2:","#DF3:","#HD0:","#DH0:","#HD1:","#DH1:","#HD2:","#DH2:"
  2030.    Data "#PC0:","#PC1:","#DS0:","#DS1:","#CD0:","#CD1:","#RAM:"
  2031.    '
  2032.    '
  2033.    DISPDIR:
  2034.    YT=Y+40
  2035.    Ink VBLACK,VBLUE
  2036.    For N=DPOS To DPOS+9
  2037.       Exit If FILELIST$(N)=""
  2038.       '
  2039.       If Left$(FILELIST$(N),1)="*" or Left$(FILELIST$(N),1)="#"
  2040.          If N=SELECTED
  2041.             Ink VBLUE,VWHITE
  2042.          Else 
  2043.             Ink VWHITE,VBLUE
  2044.          End If 
  2045.          TEMP$=Right$(FILELIST$(N),Len(FILELIST$(N))-1)
  2046.          Text X+13,YT,Left$(TEMP$,(WIDTH/8)-17)
  2047.       Else 
  2048.          If N=SELECTED
  2049.             Ink VBLACK,VWHITE
  2050.          Else 
  2051.             Ink VBLACK,VBLUE
  2052.          End If 
  2053.          TEMP$=Right$(FILELIST$(N),Len(FILELIST$(N))-1)
  2054.          If SIZE=1
  2055.             Text X+13,YT,Left$(TEMP$,(WIDTH/8)-24)+Mid$(TEMP$,Len(TEMP$)-8,7)
  2056.          Else 
  2057.             Text X+13,YT,Left$(TEMP$,(WIDTH/8)-17)
  2058.          End If 
  2059.          '
  2060.       End If 
  2061.       '
  2062.       Add YT,8
  2063.    Next N
  2064.    YT=0
  2065.    Return 
  2066.    '
  2067.    '
  2068.    FINDDIR:
  2069.    For N=0 To 300
  2070.       FILELIST$(N)=""
  2071.    Next N
  2072.    N=0 : DPOS=0 : FILEDIR$=Dir$
  2073.    DI$=Dir First$(Dir$)
  2074.    FILELIST$(0)=DI$
  2075.    While FILELIST$(N)<>"" or N>300
  2076.       Inc N
  2077.       DI$=Dir Next$
  2078.       FILELIST$(N)=DI$
  2079.    Wend 
  2080.    GAD_SLIDER_CREATE[WC,11,WIDTH-103,18,20,111,N,10] : N=0
  2081.    GAD_TEXT_SET[WC,7,Dir$,0,0]
  2082.    Ink VBLUE
  2083.    Bar X+12,Y+33 To X+WIDTH-109,Y+113
  2084.    Gosub DISPDIR
  2085.    Return 
  2086.    '
  2087.    '
  2088.    SELECTFILE:
  2089.    NUM=(Y Screen(Y Mouse)-(Y+33))/8
  2090.    TEMP$=FILELIST$(DPOS+NUM)
  2091.    If TEMP$="" Then Return 
  2092.    If Left$(TEMP$,1)=" "
  2093.       TEMP$=Right$(TEMP$,Len(TEMP$)-1)
  2094.       TEMP$=Left$(TEMP$,Len(TEMP$)-9) : Gosub STRIPTEMP
  2095.       If GADTEXT$(WC,8)=TEMP$ : FILETEMP=1 : Return : End If 
  2096.       GAD_TEXT_SET[WC,8,TEMP$,0,0]
  2097.    Else 
  2098.       FLAG$=Left$(TEMP$,1)
  2099.       TEMP$=Right$(TEMP$,Len(TEMP$)-1)
  2100.       While Mid$(TEMP$,Len(TEMP$),1)=" "
  2101.          TEMP$=Left$(TEMP$,Len(TEMP$)-1)
  2102.       Wend 
  2103.       '
  2104.       If Exist(TEMP$)
  2105.          If FLAG$="*"
  2106.             Dir$=Dir$+TEMP$
  2107.          Else 
  2108.             Dir$=TEMP$
  2109.          End If 
  2110.          '
  2111.          Gosub FINDDIR
  2112.       End If 
  2113.    End If 
  2114.    '
  2115.    Repeat : Until Mouse Key=0
  2116.    Return 
  2117.    '
  2118.    '
  2119.    STRIPTEMP:
  2120.    While Mid$(TEMP$,Len(TEMP$),1)=" "
  2121.       TEMP$=Left$(TEMP$,Len(TEMP$)-1)
  2122.    Wend 
  2123.    Return 
  2124.    '
  2125.    '
  2126.    RETREIVEDIR:
  2127.    N=0 : DPOS=0
  2128.    If Dir$=FILEDIR$
  2129.       While FILELIST$(N)<>"" or N>300
  2130.          Inc N
  2131.       Wend 
  2132.       GAD_SLIDER_CREATE[WC,11,WIDTH-103,18,20,111,N,10] : N=0
  2133.       GAD_TEXT_SET[WC,7,Dir$,0,0]
  2134.       Ink VBLUE
  2135.       Bar X+12,Y+33 To X+WIDTH-109,Y+113
  2136.       Gosub DISPDIR
  2137.    Else 
  2138.       Gosub FINDDIR
  2139.    End If 
  2140.    Return 
  2141.    '
  2142.    '
  2143.    LFILE:
  2144.    OUT$=Dir$+TEMP$
  2145.    
  2146.    QUITIT:
  2147.    WIN_CLOSE[WC]
  2148.    
  2149. End Proc[OUT$]
  2150. '
  2151. Procedure GAD_REQUEST[X,Y,TITLE$,MESSAGE$,MESSAGE2$,MESSAGE3$,BUTTON1$,BUTTON2$]
  2152.    '
  2153.    WC=WINCOUNT
  2154.    '
  2155.    '
  2156.    '
  2157.    XS=Len(TITLE$)+3
  2158.    If Len(MESSAGE$)>XS Then XS=Len(MESSAGE$)
  2159.    If Len(MESSAGE2$)>XS Then XS=Len(MESSAGE2$)
  2160.    If Len(MESSAGE3$)>XS Then XS=Len(MESSAGE3$)
  2161.    
  2162.    
  2163.    XSIZ=(XS*8)+28
  2164.    
  2165.    If XSIZ<(Len(BUTTON1$)*8)+(Len(BUTTON2$)*8)+25 Then XSIZ=(Len(BUTTON1$)*8)+(Len(BUTTON2$)*8)+27
  2166.    
  2167.    WIN_CREATE[WC,X,Y,XSIZ,58,XSIZ,58,XSIZ,58]
  2168.    WIN_FRAMEWORK[WC,1,1,0,VBLUE,TITLE$]
  2169.    
  2170.    If BUTTON1$<>"" Then GAD_BUTTON_CREATE[WC,5,5,43,12,BUTTON1$]
  2171.    If BUTTON2$<>"" Then GAD_BUTTON_CREATE[WC,6,XSIZ-(Len(BUTTON2$)*8)-11,43,12,BUTTON2$]
  2172.    
  2173.    Ink VWHITE,VBLUE
  2174.    '
  2175.    LTEKST=Len(MESSAGE$)*8
  2176.    XS=(XSIZ-LTEKST)/2
  2177.    Text X+1+XS,Y+22,MESSAGE$
  2178.    '
  2179.    LTEKST=Len(MESSAGE2$)*8
  2180.    XS=(XSIZ-LTEKST)/2
  2181.    Text X+1+XS,Y+30,MESSAGE2$
  2182.    '
  2183.    LTEKST=Len(MESSAGE3$)*8
  2184.    XS=(XSIZ-LTEKST)/2
  2185.    Text X+1+XS,Y+38,MESSAGE3$
  2186.    '
  2187.    ' below has to be done. Cant del a block which hasn't been made. 
  2188.    WIN_SETGFX[WC]
  2189.    '
  2190.    Do 
  2191.       Proc WINSCAN : BUT=Param
  2192.       If WINSELECTED=WC
  2193.          If BUT=5 : BUTTON=1 : Exit : End If 
  2194.          If BUT=6 : BUTTON=2 : Exit : End If 
  2195.       End If 
  2196.    Loop 
  2197.    '
  2198.    WIN_CLOSE[WC]
  2199.    '
  2200. End Proc[BUTTON]
  2201. '
  2202. ' Below procedure is (supposed) to move any gadget to new coordinates
  2203. '  Use for redrawing gadgets after a window resize.
  2204. '
  2205. Procedure GAD_MOVE[WINNUM,GADNUM,X,Y]
  2206.    '
  2207.    Dim TMP(6)
  2208.    '
  2209.    ' get all the stuff
  2210.    '
  2211.    TYPE=WINZONE(WINNUM,GADNUM,0)
  2212.    OLDX=WINZONE(WINNUM,GADNUM,1)
  2213.    OLDY=WINZONE(WINNUM,GADNUM,2)
  2214.    WIDTH=WINZONE(WINNUM,GADNUM,3)-OLDX
  2215.    HEIGHT=WINZONE(WINNUM,GADNUM,4)-OLDY
  2216.    '
  2217.    For N=0 To 6
  2218.       TMP(N)=GADSTUFF(WINNUM,GADNUM,N)
  2219.    Next N
  2220.    TX$=GADTEXT$(WINNUM,GADNUM)
  2221.    '
  2222.    ' redraw and replace 
  2223.    '  
  2224.    If TYPE=1
  2225.       'button  
  2226.       GAD_BUTTON_CREATE[WINNUM,GADNUM,X,Y,HEIGHT,TX$]
  2227.    Else If TYPE=5
  2228.       'text
  2229.       GAD_TEXT_CREATE[WINNUM,GADNUM,X,Y,TMP(0),TX$,TMP(1)]
  2230.    Else If TYPE=6
  2231.       'display 
  2232.       GAD_DISPLAY_CREATE[WINNUM,GADNUM,X,Y,TMP(0),TX$]
  2233.    Else If TYPE=7
  2234.       'cycle 
  2235.       VSTARTPOS=(TMP(1)-1)*TMP(0)
  2236.       If TMP(1)>1 : Inc VSTARTPOS : End If 
  2237.       
  2238.       CYCL$=Mid$(TX$,VSTARTPOS,TMP(0))
  2239.       GAD_CYCLE_CREATE[WINNUM,GADNUM,X,Y,TMP(0),CYCL$]
  2240.    Else If TYPE=13
  2241.       'vslider 
  2242.       GAD_SLIDER_CREATE[WINNUM,GADNUM,X,Y-1,WIDTH+1,HEIGHT+3,TMP(1)+TMP(2)-1,TMP(2)]
  2243.       GAD_SLIDER_UPDATE[WINNUM,GADNUM,TMP(5)]
  2244.    Else If TYPE=15
  2245.       'hslider 
  2246.       GAD_HSLIDER_CREATE[WINNUM,GADNUM,X-1,Y,WIDTH+3,HEIGHT+1,TMP(1)+TMP(2)-1,TMP(2)]
  2247.       GAD_HSLIDER_UPDATE[WINNUM,GADNUM,TMP(5)]
  2248.    Else If TYPE=17
  2249.       'check 
  2250.       GAD_CHECKBOX_CREATE[WINNUM,GADNUM,X,Y]
  2251.       If TMP(1) : GAD_CHECKBOX_TICK[WINNUM,GADNUM] : End If 
  2252.    Else If TYPE=20
  2253.       'sbut
  2254.       GAD_SBUT_OUT[WINNUM,GADNUM]
  2255.    Else If TYPE=32
  2256.       'RADIO 
  2257.       If GADRADIO(WINNUM,TMP(1))=GADNUM
  2258.          GAD_RADIOBUT_IN[WINNUM,GADNUM]
  2259.       Else 
  2260.          GAD_RADIOBUT_OUT[WINNUM,GADNUM]
  2261.       End If 
  2262.    Else If TYPE=34
  2263.       'scroll
  2264.       GAD_SCROLLBUT_CREATE[WINNUM,GADNUM,X,Y]
  2265.    End If 
  2266.    
  2267.    If TYPE=13 or TYPE=15
  2268.       E=5
  2269.    Else 
  2270.       E=6
  2271.    End If 
  2272.  
  2273.    For N=0 To E
  2274.       GADSTUFF(WINNUM,GADNUM,N)=TMP(N)
  2275.    Next N
  2276.    
  2277.    GADTEXT$(WINNUM,GADNUM)=TX$
  2278. End Proc